2.1 创建一颗二叉树创建一颗二叉树,可以创建先序二叉树,中序二叉树,后序二叉树。
我们在创建的时候为了方便,不妨用‘#’表示空节点,这时如果先序序列是:6 4 2 3 # # # # 5 1 # # 7 # #,那么创建的二叉树如下:下面是创建二叉树的完整代码:穿件一颗二叉树,返回二叉树的根2.2 二叉树的遍历二叉树的遍历分为:先序遍历,中序遍历和后序遍历,这三种遍历的写法是很相似的,利用递归程序完成也是灰常简单的:2.3 层次遍历层次遍历也是二叉树遍历的一种方式,二叉树的层次遍历更像是一种广度优先搜索(BFS)。
因此二叉树的层次遍历利用队列来完成是最好不过啦,当然不是说利用别的数据结构不能完成。
2.4 求二叉树中叶子节点的个数树中的叶子节点的个数= 左子树中叶子节点的个数+ 右子树中叶子节点的个数。
利用递归代码也是相当的简单,2.5 求二叉树的高度求二叉树的高度也是非常简单,不用多说:树的高度= max(左子树的高度,右子树的高度) + 12.6 交换二叉树的左右儿子交换二叉树的左右儿子,可以先交换根节点的左右儿子节点,然后递归以左右儿子节点为根节点继续进行交换。
树中的操作有先天的递归性。
2.7 判断一个节点是否在一颗子树中可以和当前根节点相等,也可以在左子树或者右子树中。
2.8 求两个节点的最近公共祖先求两个节点的公共祖先可以用到上面的:判断一个节点是否在一颗子树中。
(1)如果两个节点同时在根节点的右子树中,则最近公共祖先一定在根节点的右子树中。
(2)如果两个节点同时在根节点的左子树中,则最近公共祖先一定在根节点的左子树中。
(3)如果两个节点一个在根节点的右子树中,一个在根节点的左子树中,则最近公共祖先一定是根节点。
当然,要注意的是:可能一个节点pNode1在以另一个节点pNode2为根的子树中,这时pNode2就是这两个节点的最近公共祖先了。
显然这也是一个递归的过程啦:可以看到这种做法,进行了大量的重复搜素,其实有另外一种做法,那就是存储找到这两个节点的过程中经过的所有节点到两个容器中,然后遍历这两个容器,第一个不同的节点的父节点就是我们要找的节点啦。
实际上这还是采用了空间换时间的方法。
2.9 从根节点开始找到所有路径,使得路径上的节点值和为某一数值(路径不一定以叶子节点结束)这道题要找到所有的路径,显然是用深度优先搜索(DFS)啦。
但是我们发现DFS所用的栈和输出路径所用的栈应该不是一个栈,栈中的数据是相反的。
看看代码:注意使用的两个栈。
结点的度: 结点下面关联几个节点就是结点的度树的度: 结点度最高的度为树的度叶子结点: 结点下面没子结点度为0的结点分支标点: 不是叶子结点的结点内部结点:不是最顶层也是不是最底层的结点父结点, 兄弟结点, 子结点都是相对的.层次: 顶层为0层(有些定为1层)下面依次加一层树的结点总数(n)=总度数(k)+11/ | \2 3 4/| \\5 6 7 8/\9 10树的遍历:前序遍历: 根->最左子结点->再最左边(先访问根, 再访问子结点, 子结点, 可以看作一个子树)后序遍历: 先子节点, 再根节点层次遍历: 是分层一个一个来.前: 1, 2, 5, 6, 7, 3, 4, 8, 9, 10后: 5, 6, 7, 2, 3, 9, 10, 8, 4, 1层: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10二叉树:二叉树最多只能有两个结点. 二叉树分左子右子, 一般树不分.满二叉树: 每个节点都是两个节点完全二叉树: 如果一个二叉树有n层, n-1层是满树, 最后一层要从左到右排列.特性:1.二叉树第i层, 最多只能有2^(i-1)个结点(i>=1)2.深度为k的二叉树最多有2^k-1个结点(k>=1)3.对任何一棵二叉树, 如果其叶子结点数为n0, 度为2的结点数为n2, 则n0 = n2 + 14.如果一个完全二叉树的结点按层次编号.1)如果i=1,则结点i无父结点, 是二叉树的根; 如果i > 1, 则父结点是i/2 向下取整;2)如果2i > n, 则结点i为叶子结点, 无左子结点; 否则, 其左子结点是结点2i;3)如2i + 1 > n, 则结点i无右子叶点, 否则, 其右子结点是结点2i+1.二叉树多一个中序遍历:先左再根再右树与二叉树转换:一棵树转成等价的二叉树任意结点的孩子结点转成二叉树的左子树结点, 兄弟结点转为二叉树的右子结点画图时可以断开除最左边的结点, 然后水平连结点兄弟结点(共同父结点, 唐兄节点不连) 原来左边连线就是左结点, 先连成的是右结点(2)由3 个结点可以构造出多少种不同的二叉树?()A.2 B.3 C.4 D.5(3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。
A.250 B. 500 C.254 D.501(4)一个具有1025个结点的二叉树的高h为()。
A.11 B.10 C.11至1025之间 D.10至1024之间(5)深度为h的满m叉树的第k层有()个结点。
(1=<k=<h)A.m k-1 B.m k-1 C.m h-1 D.m h-1(6)利用二叉链表存储树,则根结点的右指针是()。
A.指向最左孩子 B.指向最右孩子 C.空 D.非空(7)对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用()遍历实现编号。
A.先序 B. 中序 C. 后序 D. 从根开始按层次遍历(8)若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用()遍历方法最合适。
A.前序 B.中序 C.后序 D.按层次(9)在下列存储形式中,()不是树的存储形式?A.双亲表示法 B.孩子链表表示法 C.孩子兄弟表示法D.顺序存储表示法(10)一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()。
A.所有的结点均无左孩子B.所有的结点均无右孩子C.只有一个叶子结点 D.是任意一棵二叉树(11)某二叉树的前序序列和后序序列正好相反,则该二叉树一定是()的二叉树。
A.空或只有一个结点 B.任一结点无左子树C.高度等于其结点数 D.任一结点无右子树(12)若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为()。
A.X的双亲 B.X的右子树中最左的结点C.X的左子树中最右结点 D.X的左子树中最右叶结点(13)引入二叉线索树的目的是()。
A.加快查找结点的前驱或后继的速度 B.为了能在二叉树中方便的进行插入与删除C.为了能方便的找到双亲 D.使二叉树的遍历结果唯一(14)线索二叉树是一种()结构。
A.逻辑 B.逻辑和存储 C.物理 D.线性(15)设F是一个森林,B是由F变换得的二叉树。
若F中有n个非终端结点,则B中右指针域为空的结点有()个。
A. n-1 B.n C. n+1 D. n+2判断1. 二叉树是度为2的有序树。
×2. 完全二叉树一定存在度为1的结点。
×3. 对于有N个结点的二叉树,其高度为log2n。
×4.深度为K的二叉树中结点总数≤2k-1。
√22.完全二叉树中,若一个结点没有左孩子,则它必是树叶。
√ 23. 二叉树只能用二叉链表表示。
×27. 用链表(llink-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n-1个空指针。
×28. 二叉树中每个结点至多有两个子结点,而对一般树则无此限制.因此,二叉树是树的特殊情形. ×30.在二叉树的第i层上至少有2i-1个结点(i>=1)。
×34.在二叉树中插入结点,则此二叉树便不再是二叉树了。
× 35.二叉树是一般树的特殊情形。
×36.树与二叉树是两种不同的树型结构。
√ 39.度为二的树就是二叉树。
×41.下面二叉树的定义只有一个是正确的,请在正确的地方画“√”。
(1)它是由一个根和两株互不相交的、称为左子树和右子树的二叉树组成。
(2)(a)在一株二叉树的级i上,最大结点数是2i-1(i≥1)(b)在一棵深度为k的二叉树中,最大结点数是2k-1+1(k≥1)。
(3)二叉树是结点的集合,满足如下条件:√(a)它或者是空集;(b)或者是由一个根和两个互不相交的、称为左子树和右子树的二叉树组成。
50. 用链表(llink-rlink)存储包含n个结点的二叉树时,结点的2n个指针区域中有n+1个空指针。
√)2.应用题(1)试找出满足下列条件的二叉树①先序序列与后序序列相同②中序序列与后序序列相同③先序序列与中序序列相同④中序序列与层次遍历序列相同先序遍历二叉树的顺序是“根—左子树—右子树”,中序遍历“左子树—根—右子树”,后序遍历顺序是:“左子树—右子树―根",根据以上原则,本题解答如下:(1)若先序序列与后序序列相同,则或为空树,或为只有根结点的二叉树(2)若中序序列与后序序列相同,则或为空树,或为任一结点至多只有左子树的二叉树.(3)若先序序列与中序序列相同,则或为空树,或为任一结点至多只有右子树的二叉树.(4)若中序序列与层次遍历序列相同,则或为空树,或为任一结点至多只有右子树的二叉树(2)设一棵二叉树的先序序列: A B D F C E G H ,中序序列: B F D A G E H C ①画出这棵二叉树。
②画出这棵二叉树的后序线索树。
③将这棵二叉树转换成对应的树(或森林)。
(1) (2)(3) 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。
① 试为这8个字母设计赫夫曼编码。
② 试设计另一种由二进制表示的等长编码方案。
③ 对于上述实例,比较两种方案的优缺点。
解:方案1;哈夫曼编码先将概率放大100倍,以方便构造哈夫曼树。
w={7,19,2,6,32,3,21,10},按哈夫曼规则:【[(2,3),6], (7,10)】, ……19, 21, 32(100) (40) (60)19 21 32 (28) () (11) 7 10 6 (5)2 3方案比较:=A BM F D (3) C EM H G2(0.19+0.32+0.21)+4(0.07+0.06+0.10)+5(0.02+0.03)=1.44+0.92+0.25=2.61方案2的WPL =3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3结论:哈夫曼编码优于等长二进制编码(4)已知下列字符A 、B 、C 、D 、E 、F 、G 的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT 的存储结构的初态和终态。