二叉树
来源:互联网 发布:c语言中return的作用 编辑:程序博客网 时间:2024/06/06 02:34
1.二叉树的定义
二叉树是n个结点的有限集合,改集合或者为空集,或者由一个根节点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
2.二叉树的特点
每个结点最多有两棵子树,所以不存在度大于2的结点。注意是最多有!
左子树和右子树是有顺序的,次序不能任意颠倒。
即使书中某结点只有一棵子树,也要区分它是左子树还是右子树
3.特殊二叉树
3.1.斜树
顾名思义,斜树一定要是斜的。所有的结点都只有左子树的二叉树是左斜树。所有...右斜树。斜树很明显特点就是每一层都只有一个结点,结点的个数与二叉树的深度相同。这其实就是线性表结构。
3.2.满二叉树
在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。下图既是一棵满二叉树:
因此,二叉树的特点有:(1)叶子结点只能出现在最下一层。出现在其他层就不可能达到平衡。
(2)非叶子结点的度一定是2.
(3)在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多。
3.完全二叉树
对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树。如图:
如何理解完全二叉树?
很多开始学习数据结构的同学有时都会搞混满二叉树和完全二叉树。首先,满二叉树一定是一棵完全二叉树,而反过来不一定成立。
其次,完全二叉树的所有结点与同样深度的满二叉树,它们按层序编号相同的结点,是一一对应的。这里需要理解什么是按层序编号,如下图中的树1,因为5结点没有左子树,却有右子树,那就是的按层序编号的第10个编号空挡了。同样道理,树2,由于3结点没有字数,所以使得6,7编号的位置空挡。树3又是因为5编号下没有子树造成第11和第10位置空挡。只有上图,因为编号是连续的,所以它是完全二叉树。
从上面可得出一些完全二叉树的特点:
(1)叶子结点只能出现在最下两层。
(2)最下层的叶子一定集中在左部连续位置;
(3)倒数二层,若有叶子结点,一定都在右部连续位置出现;
(4)如果结点度为1,则该结点只有左孩子,即不存在只有右孩子的情况;
(5)同样结点书的二叉树,完全二叉树的深度最小。
所以判断完全二叉树的办法就是看着树的示意图,心中默默给每个结点按照满二叉树的结构逐层顺序编号,如果编号出现空档,就说明不是完全二叉树,否则就是。
4.二叉树的性质
性质1:在二叉树的第i层上至多有2^(i-1)个结点(i>=1).
性质2:深度为k的二叉树至多有2^k-1个结点(k>=1)。
性质3:对任何一棵二叉树T,如果其终端结点数为n0,度2的结点数为n2,则n0=n2+1.
性质4:具有n个结点的完全二叉树的深度为[log2^n]+1(其中[x]表示不大于x的最大整数)。
性质5:如果对一棵有n个结点的完全二叉树的结点按层序变换(从第1层到第[log2^n]+1层,每层从左到又),对任一结点i(1<=i<=n)有:
1.如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点[i/2].
2.如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i.
3.如果2i+1>n,则结点i无有孩子;否则其右孩子是结点2i+1.
5.二叉树的存储结构
1)二叉树的顺序存储结构
可以使用顺序存储结构实现二叉树。也就是用一维数组存储二叉树中的结点,结点的存储位置能体现结点之间的逻辑关系。
先看看完全二叉树的顺序存储:
存入数组为:
对于一般二叉树,把不存在的结点设置为“^”而已。
2)二叉链表
| lchild | data | rchild |
其中data为数据域,lchild和rchild为指针域,分别存放指向左孩子还右孩子的指针
下面是二叉链表结点结构定义代码:
typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;6.遍历二叉树
主要讨论这四种遍历方法:
1.前序遍历
规则:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。
2.中序遍历
规则:。。。,否则从根节点(但不是先访问根结点),中序遍历根结点的左子树,然后访问根结点,最后中序遍历右子树。
后序遍历
规则:。。。,从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点。
层序遍历:。。。,从树的第一层,开始从上而下逐层遍历。同一层中,从左到右。
二叉树遍历两种重要的性质:
1.已知前序遍历和中序遍历可以唯一确定一棵二叉树;
2.已知后序遍历和中序遍历可以。。。。
但是已知前序遍历和后序遍历不能确定一棵二叉树。
(本文是对《大话数据结构》的二叉树讲解的简单总结,完全参考该书,更多详细的介绍,读者可以阅读该书)
- 二叉树、二叉堆
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- C++中 形如int x:1;int x:2;int x:32(冒号后为1-32,32为最大值)的意思解释
- 学习一种新的编程语言所要做的15个练习
- Perl中的隐藏变量
- C++中 形如int x:1;int x:2;int x:32(冒号后为1-32,32为最大值)的意思解释
- 如何学习一个新的PHP框架
- 二叉树
- 自绘按钮的实现
- c语言六种位操作详解
- 选球博奕与动态规划(二)
- 【Linux基础】Linux内核编译
- 静态变量和实例变量
- cocos2d - 粒子系统工具(Particle Designer)
- 卡特兰数
- android sdk manager 更新异常 处理方法