0、二叉树的概念
若将树中每个结点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树(Ordered Tree),因而二叉树是有序树,但是二叉树的度不一定等于2
-
n 2 =n 0 -1其中,n 2 是二叉树度为2的结点数, n 0 是二叉树度为零的结点。在证明之前先了解如下概念:1)度:结点拥有的子树数称为结点的度。度为0的结点称为叶结点或终端结点。2)分支线总数:从分支线进入结点的角度计算分支线总数,对于二叉树除了根结点意外每个结点都有一个分支线,因此分支线总数为n-1,其中n为结点的总数。
若用n 1表示度为1的结点数,那么二叉树结点总数n=n 0+n1+n2(此式比较好理解,二叉树只有度为0,1,2的结点)而分支线总数为n-1=n 1 +2* n 2两式可推出 n 0 + n 1 + n 2-1=n 1 +2* n 2,即n 2 =n 0 -1。
例:二叉树是度为2的有序树是错的
一棵度为二的有序树与一棵二叉树的区别在于:有序树的结点次序是相对于另一结点而言的,如果有序树中的子树只有一个孩子时,这个孩子结点就无须区分其左右次序,而二叉树无论其孩子数是否为2,均需确定其左右次序,也就是说二叉树的结点次序不是相对于另一结点而言而是确定的
1、高度和节点数的问题
(1)对于有n个结点的二叉树,高度为
-
1+logn到n之间吧任意一个数
-
每层只有一个结点,那深度是n,
-
完全二叉树的高度为[log2(n)]+1
给定序列 6 4 8 5 7 9 3构建二叉排序树 并画出先序索二叉树
二叉排序树就是中序遍历之后是有序的;
构造二叉排序树步骤如下;
插入法构造
第二个结点 4 比 6 来的小 所以插入在 6 的左子树;
第三个结点 8 比 6 来的大 所以插入在 6 的右子树;
第四个结点 5 比6 来得小 先进入左子树然后跟 4比较,
5 比4 大 所以插入在 4 的右子树;
以此类推 将要插入的结点先跟根结点比较, 比根结点大进入右子树 反之进入 左子树;
在跟进入的 左子树(右子树)的结点比较 方法同上;
直到没有结点了 在插入; 你给的排序最后的二叉排序树如下;
中序遍历结果是 : 3 4 5 6 7 8 9 ;
先序遍历结果是 : 6 4 3 5 8 7 9 ;
-
卡特兰数:h(n)=C(2n,n)/(n+1) (n=0,1,2,...)h(3)=C(6,3)/4=5
-
二叉树的还原必须有中序和另外任一遍历顺序
-
必须要有中序排序。
前序: |根|左右 |
后序: |左右|根 |
如果没有中序,显然左右这部分不知道具体怎么分,哪部分是左,哪部分是右,没有界限。
如果有了中序, |左|根|右|,很明显,左右以根结点区分开来。
(1)普通树转换为二叉树的方法是:
①树中所有相同双亲结点的兄弟节点之间加一条连线
②对树中不是双亲结点第一个孩子的结点,只保留新添加的该结点与左兄弟结点之间的连线,删去该结点与双亲结点之间的连线
③整理所有保留和添加的的连线,使每个结点的第一个孩子结点连线位于左孩子指针位置,使每个结点的右兄弟结点连线位于右孩子指针位置:
整个转换过程如下图从左到右所示
(
-
大孩子变左孩子,兄弟变右孩子
)
(2)二叉树转换成森林
根及其左子树为一棵树,右子树成为另一棵树,不断地分化,直到最后一棵二叉树没有右子树。左孩子变大孩子,右孩纸变兄弟
-
三叉链表每个节点有三个指针域(左、亲、右),共3n个指针。其中非空指针=亲(n-1个,因为根节点没有双亲)+左右(n-1,因为n个节点的二叉树有n-1条边)=2n-2;所以空指针=3n-(2n-2)=n+2。
-