二叉树的递归定义及存储

定义


最多有两棵子树的有序树,称为二叉树。二叉树是一种特殊的

递归定义:二叉树是n(n>=0)个有限结点构成的集合。N=0称为空二叉树;n>0的二叉树由一个根结点和两互不相交的,分别称为左子树和右子树的二叉树构成。

二叉树中任何结点的第1个子树称为其左子树,左子树的根称为该结点的左孩子;二叉树中任何结点的第2个子树称为其右子树,左子树的根称为该结点的右孩子。如下图是一个二叉树:

图1.二叉树

满二叉树和完全二叉树

在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且叶子结点都在同一层上,这样的二叉树称作满二叉树。一棵深度为k且由2k-1个结点的二叉树称为满二叉树。

如果一棵具有n个结点的二叉树的结构与满二叉树的前n个结点的结构相同,这样的二叉树称作完全二叉树

图2. 满二叉树和完全二叉树


基本性质


这里规定二叉树的根结点的层次为1。

性质1:则二叉树的第i 层最多有2i-1个结点(在此二叉树的层次从1开始,i≥1)

性质2:深度为k的二叉树最多有2k-1个结点。(k≥1)

性质3:对任何一棵二叉树T, 如果其叶结点个数为n0, 度为2的非叶结点个数为n2, 则有

             n0 = n2 + 1

性质4:具有 n(n>0)个结点的完全二叉树的深度为⎣log2n⎦+1;⎦x⎦表示不超过x的最大整数。

性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第⎣l og2n⎦ +1层,每层从左到右),则对任一结点i(1≤i≤n),有:

(1)如果i=1,则结点i无双亲,是二叉树的根;如果i>1,则其双亲是结点⎣i/2⎦。

(2) 如果2i<=n, 则结点i的左孩子结点是2i;否则,结点i为叶子结点,无左孩子结点。

(3)如果2i+1<=n,则结点i的右孩子是结点2i+1; 否则,结点i为叶子结点,无右孩子结点。


抽象数据类型


数据元素:具有相同特性的数据元素的集合。

结构关系:树中数据元素间的结构关系由二叉树的定义确定。

基本操作:树的主要操作有

(1)创建树IntTree(&T)

(2)销毁树DestroyTree(&T)

(3)构造树CreatTree(&T,deinition)

(4)置空树ClearTree(&T)

(5)判空树TreeEmpty(T)

(6)求树的深度TreeDepth(T)

(7)获得树根Root(T)

(8)获取结点Value(T,cur_e,&e),将树中结点cur_e存入e单元中。

(9)数据赋值Assign(T,cur_e,value),将结点value,赋值于树T的结点cur_e中。

(10)获得双亲Parent(T,cur_e),返回树T中结点cur_e的双亲结点。

(11)获得最左孩子LeftChild(T,cur_e),返回树T中结点cur_e的最左孩子。

(12)获得右兄弟RightSibling(T,cur_e),返回树T中结点cur_e的右兄弟。

(13)插入子树InsertChild(&T,&p,i,c),将树c插入到树T中p指向结点的第i个子树之前。

(14)删除子树DeleteChild(&T,&p,i),删除树T中p指向结点的第i个子树。

(15)遍历树TraverseTree(T,visit())


二叉树的存储结构


 二叉树是非线性结构,即每个数据结点至多只有一个前驱,但可以有多个后继。它可采用顺序存储结构和链式存储结构。

1.顺序存储结构

    二叉树的顺序存储,就是用一组连续的存储单元存放二叉树中的结点。因此,必须把二叉树的所有结点安排成为一个恰当的序列,结点在这个序列中的相互位置能反映出结点之间的逻辑关系,用编号的方法从树根起,自上层至下层,每层自左至右地给所有结点编号,缺点是有可能对存储空间造成极大的浪费,在最坏的情况下,一个深度为k且只有k个结点的右单支树需要2k-1个结点存储空间。依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系,这样既能够最大可能地节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。图5-5(a)是一棵完全二叉树,图5-5(b)给出的图5-5(a)所示的完全二叉树的顺序存储结构。

 (a)  一棵完全二叉树                  (b)    顺序存储结构

图5-5 完全二叉树的顺序存储示意图

    对于一般的二叉树,如果仍按从上至下和从左到右的顺序将树中的结点顺序存储在一维数组中,则数组元素下标之间的关系不能够反映二叉树中结点之间的逻辑关系,只有增添一些并不存在的空结点,使之成为一棵完全二叉树的形式,然后再用一维数组顺序存储。如图5-6给出了一棵一般二叉树改造后的完全二叉树形态和其顺序存储状态示意图。显然,这种存储对于需增加许多空结点才能将一棵二叉树改造成为一棵完全二叉树的存储时,会造成空间的大量浪费,不宜用顺序存储结构。最坏的情况是右单支树,如图5-7 所示,一棵深度为k的右单支树,只有k个结点,却需分配2^k-1个存储单元。

(a) 一棵二叉树                          (b) 改造后的完全二叉树

(c) 改造后完全二叉树顺序存储状态

图5-6 一般二叉树及其顺序存储示意图

 (a) 一棵右单支二叉树      (b) 改造后的右单支树对应的完全二叉树

    (c) 单支树改造后完全二叉树的顺序存储状态

                   图5-7 右单支二叉树及其顺序存储示意图

    结构5-1二叉树的顺序存储

复制代码
#define Maxsize 100     //假设一维数组最多存放100个元素
typedef char Datatype;  //假设二叉树元素的数据类型为字符
typedef struct
{ Datatype bt[Maxsize];int btnum;}Btseq;
复制代码

2.链式存储结构

    二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。

通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为:

  其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL表示)。利用这样的结点结构表示的二叉树的链式存储结构被称为二叉链表,如图5-8所示。  

(a) 一棵二叉树                           (b) 二叉链表存储结构

                  图5-8   二叉树的二叉链表表示示意图

    为了方便访问某结点的双亲,还可以给链表结点增加一个双亲字段parent,用来指向其双亲结点。每个结点由四个域组成,其结点结构为:

 这种存储结构既便于查找孩子结点,又便于查找双亲结点;但是,相对于二叉链表存储结构而言,它增加了空间开销。利用这样的结点结构表示的二叉树的链式存储结构被称为三叉链表。

    图5-9给出了图5-8 (a)所示的一棵二叉树的三叉链表表示。

 图5-9二叉树的三叉链表表示示意图

    尽管在二叉链表中无法由结点直接找到其双亲,但由于二叉链表结构灵活,操作方便,对于一般情况的二叉树,甚至比顺序存储结构还节省空间。因此,二叉链表是最常用的二叉树存储方式。

结构5-2二叉树的链式存储

#define datatype char  //定义二叉树元素的数据类型为字符
typedef struct  node   //定义结点由数据域,左右指针组成
{ Datatype data;struct node *lchild,*rchild;}Bitree;


转载于:https://www.cnblogs.com/tham/p/6827431.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++统计微妙级时间消耗(chrono)

有时我们需要统计某段程序运行所消耗的时间&#xff0c;通过C的chrono库&#xff0c;我们可以轻松实现这一需求&#xff0c;例如&#xff0c;我们求斐波那契数列消耗的时间。 #include <iostream> #include <chrono> #include <iomanip> using namespace st…

content-length与Transfer-Encoding: chunked的问题释疑

content-length与Transfer-Encoding: chunked的问题释疑 http返回头中content-length与Transfer-Encoding: chunked的问题释疑 先说说问题出现的背景&#xff1a; 公司服务器与手机客户端交互&#xff0c;客户端请求一个动态生成的XML文件&#xff0c;在用firebug查看http响应头…

基于RSA的加密/解密示例C#代码

在C#程序中&#xff0c;大家可能比较熟悉的方式是md5加密解密方式&#xff0c;对RSA可能并不是很熟悉&#xff0c; 下面就说一下RSA加密和解密的算法&#xff1a;using System;using System.Security.Cryptography;using System.Text;class RSACSPSample{static void Main(){tr…

iOS GorupBy

转自&#xff1a; IOS 数组分组 Grouped NSArray 12345678NSMutableSet *set[NSMutableSet set];[_list enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {[set addObject:obj["MeasureType"]];//利用set不重复的特性,得到有多少组,根据数组中的…

android通过adb shell播放音乐

am start -n com.android.music/com.android.music.MediaPlaybackActivity -d /sdcard/timian.mp3拓展阅读 input keyevent 24 #增加音量 input keyevent 25 #降低音量 input keyevent 85 #暂停/播放 input keyevent 126 #恢复播放 input keyevent 127 #停止播放关闭音乐播放器…

NetBpm 安装篇(1)

尊重别人劳动成果 转载注明出处&#xff1a;http://www.cnblogs.com/anbylau2130/p/3875718.html 官方主页 http://www.netbpm.org/docs/install.html 文件目录 Netbpm的两种服务器配置 1&#xff0c;CassiniWebServer CassiniWebServer.exe是轻量级的web服务器&#xff0c;相…

python将文本中的数据处理成图像(matplotlib)

使用Python的matplotlib模块可以很方便的将数据处理成图表&#xff0c;使数据更加形象、直观。 #!/usr/bin/env pythonimport matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid.anchored_artists import AnchoredTexty1np.loadtxt(ReadDataCostTime.…

string 中的 length函数 和size函数 返回值问题

string 中的 length函数 和 size函数 的返回值 ( 还有 char [ ] 中 测量字符串的 strlen 函数 ) 应该是 unsigned int 类型的 不可以 和 -1 比较。 应尽量避免 unsigned int 类型 和 int类型 数据 的比较 。当unsigned int 类型 和 int类型 数据 比较 时 &#xff0c;会 把…

交叉编译android版htop

编这个东西贼烦人。 话不多说&#xff0c;直接上教程 源代码版本&#xff1a;htop-2.2.0、ncurses-6.1 编译之前要确认自己有ndk&#xff0c;从【官网】直接下载&#xff0c;下载下来解压一下就能用。 先编ncurses 编译过程 ./configure CCarm-linux-androideabi-gcc-4.9 \-…

今天的一点点收获

今天怎么说呢&#xff0c;还是有点收获的&#xff0c;上午写了一上午的前端&#xff0c;然后就是下午又是一下午的c#&#xff0c;好特么酸爽啊&#xff0c;但是有一件特别蛋疼的事情发生了&#xff0c;我 天天叫的学长竟然不是学长而是学校的而老师&#xff0c;但是他们都不叫他…

jquery动态添加删除div--事件绑定,对象克隆

我想做一个可以动态添加删除div的功能。中间遇到一个问题&#xff0c;最后在manong123.com开发文摘 版主的热心帮助下解答了(答案在最后) 使用到的jquery方法和思想就是&#xff1a;事件的绑定和销毁(unbind)&#xff0c;另外还可以使用clone,通过克隆可以很好的解决这个问…

编程知识大杂烩

以下资料完全是随手记录&#xff0c;没有任何顺序或关联&#xff0c;需要用直接^F找就行了。 1. ps aux指令详解 http://blog.csdn.net/hanner_cheung/article/details/6081440 2. Linux下配置Apache php http://lelong.iteye.com/blog/904125 3. shell定义变量 http://see.xid…

最长公共前缀

2、最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例1 输入: ["flower","flow","flight"] 输出: "fl"示例2 输入: ["dog","racecar",…

devexpress中gridcontrol头部添加垂直线(右边框)

winform开发&#xff0c;用devexpress中的gridcontrol控件&#xff0c;头部默认是3D样式&#xff0c;当客户希望像内容一样扁平化显示且需要添加垂直线(右边框)时恶梦开始了。。经过一阵摸索发现可以这样解决&#xff1a; 1.设置GridControl的GridView控件的PaintStyleName属性…

UITableView知识梳理须知—(一)

1、UITableView掌握 1> 设置UITableView的dataSource、delegate 2> UITableView多组数据和单组数据的展示 3> UITableViewCell的常见属性 4> UITableView的性能优化&#xff08;cell的循环利用&#xff09; 5> 自定义Cell 2、什么是UITableView 在i…

Yarn中的几种状态机

1 概述 为了增大并发性&#xff0c;Yarn采用事件驱动的并发模型&#xff0c;将各种处理逻辑抽象成事件和调度器&#xff0c;将事件的处理过程用状态机表示。什么是状态机&#xff1f; 如果一个对象&#xff0c;其构成为若干个状态&#xff0c;以及触发这些状态发生相互转移的事…

反转字符串里的单词

4、反转字符串里的单词 给定一个字符串&#xff0c;逐个反转字符串中的单词 示例1&#xff1a; 输入: "the sky is blue", 输出: "blue is sky the".说明&#xff1a; 无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格&#xff0…

正整数

题目链接&#xff1a;http://acm.hust.edu.cn/vjudge/contest/view.action?cid84077#problem/A 题目&#xff1a; Description A magic island Geraldion, where Gerald lives, has its own currency system. It uses banknotes of several values. But the problem is, the s…

360 webscan中防注入跨站攻击的核心

//get拦截规则 $getfilter "\\<.javascript:window\\[.{1}\\\\x|<.*(&#\\d?;?)?>|<.*(data|src)data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\\(\d?|sleep\s*?\\([\d\.]?\\)|load_file\s*?\\()|<[…

POJ 2115 C Looooops(扩展欧几里得)

辗转相除法&#xff08;欧几里得算法&#xff09; 时间复杂度&#xff1a;在O(logmax(a, b))以内 int gcd(int a, int b) {if (b 0) return a;return gcd(b, a % b); }扩展欧几里得算法 时间复杂度和欧几里得算法相同 int extgcd(int a, int b, int& x, int& y) {int …