1、Tree & Binary Tree,树的类型定义,n(n0)个元素的有限集合,基 本 术 语,结点,结点的度,树的度,叶子结点,分支结点,数据元素+若干指向子树的分支,分支的个数,树中所有结点的度的最大值,度为零的结点,度大于零的结点,D,H,I,J,M,(从根到结点的)路径,孩子结点、双亲结点 兄弟结点、堂兄弟结点 祖先结点、子孙结点,由从根到该结点所经分支和结点构成,A,B,C,D,E,F,G,H,I,J,M,K,L,结点的层次,树的深度,A,B,C,D,E,F,G,H,I,J,M,K,L,假设根结点的层次为1,第l 层的结点的子树根结点的层次为l+1,树中叶子结点所在的最大层次,任何一
2、棵非空树是一个二元组Tree = (root,F) 其中 root 被称为根结点F 被称为子树森林,森林,是m(m0)棵互 不相交的树的集合,A,root,B,C,D,E,F,G,H,I,J,M,K,L,F,() 有确定的根 () 树根和子树根之间为有向关系,有向树,有序树,子树之间存在确定的次序关系,无序树,子树之间不存在确定的次序关系,结点(node) 结点的度(degree) 分支(branch)结点 叶(leaf)结点 子女(child)结点 双亲(parent)结点,兄弟(sibling)结点 祖先(ancestor)结点 子孙(descendant)结点 结点所处层次(level)
3、 树的高度(depth) 树的度(degree),对比树型结构和线性结构的结构特点,线性结构,树型结构,第一个数据元素(无前驱),根结点(无前驱),最后一个数据元素(无后继),多个叶子结点(无后继),其它数据元素 (一个前驱、一个后继),其它数据元素 (一个前驱、多个后继),树的抽象数据类型定义,数据对象 D,D是具有相同特性的数据元素的集合,1.若D为空集,则称为空树 2.在D中存在唯一的称为根的数据元素 root 3.当n1时,其余结点可分为m (m0)个 互不相交的有限集T1, T2, , Tm,其中每一棵子集本身又是一棵符合本定义 的树,称为根root的子树,数据关系 R,基本操作,查
4、 找 类,插 入 类,删 除 类,Root(T) / 求树的根结点,查找类,Value(T, cur_e) / 求当前结点的元素值,Parent(T, cur_e) / 求当前结点的双亲结点,LeftChild(T, cur_e) / 求当前结点的最左孩子,RightSibling(T, cur_e) / 求当前结点的右兄弟,TreeEmpty(T) / 判定树是否为空树,TreeDepth(T) / 求树的深度,TraverseTree( T, Visit() ) / 遍历,InitTree(&T) / 初始化置空树,插入类,CreateTree(&T, definition) / 按定义构
5、造树,Assign(T, cur_e, value) / 给当前结点赋值,InsertChild(&T, &p, i, c) / 将以c为根的树插入为结点p的第i棵子树,ClearTree(&T) / 将树清空,删除类,DestroyTree(&T) / 销毁树的结构,DeleteChild(&T, &p, i) / 删除结点p的第i棵子树,A,B,C,D,E,F,G,H,I,J,M,K,L,A( B(E, F(K, L), C(G), D(H, I, J(M) ),T1,T3,T2,树根,二叉树的类型定义,二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交叉的二叉树组成
6、,A,B,C,D,E,F,G,H,K,根结点,左子树,右子树,二叉树的五种基本形态,N,空树,只含根结点,N,N,N,L,R,R,右子树为空树,L,左子树为空树,左右子树均不为空树,二叉树的主要基本操作,查 找 类,插 入 类,删 除 类,Root(T) Value(T, e) Parent(T, e)LeftChild(T, e) RightChild(T, e)LeftSibling(T, e) RightSibling(T, e)BiTreeEmpty(T) BiTreeDepth(T),PreOrderTraverse(T, Visit()InOrderTraverse(T, Visi
7、t()PostOrderTraverse(T, Visit()LevelOrderTraverse(T, Visit(),InitBiTree(&T)Assign(T, &e, value)CreateBiTree(&T, definition)InsertChild(T, p, LR, c),ClearBiTree(&T) DestroyBiTree(&T)DeleteChild(T, p, LR),完全二叉树 丰满二叉树 排序二叉树 平衡二叉树,二叉树的分类,满二叉树:指的是深度为k且含有2k-1个结点的二叉树,完全二叉树:树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对
8、应,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,a,b,c,d,e,f,g,h,i,j,二叉树 的重要特性,性 质 1在二叉树的第i(i1)层上至多有 2i-1 个结点,用归纳法证明 归纳基础归纳假设归纳证明,i = 1 层时,只有一个根结点:2i-1 = 20 = 1,假设对所有的 j,1 j i, 命题成立,二叉树上每个结点至多有两 棵子树,则第 i 层的结点数 2i-2 2 = 2i-1,性 质 2深度为k(k1)的二叉树上至多 含2k-1 个结点,证明,基于上一条性质,深度为 k 的二 叉树上的结点数至多为20+21+ +2k-1 = 2k-1,性 质 3对
9、任何一棵二叉树,若它含有n0 个 叶子结点、n2 个度为2的结点,则必存 在关系式:n0 = n2+1,证明,设二叉树上结点总数 n = n0 + n1 + n2 又二叉树上分支总数 b = n1+2n2而 b = n-1 = n0 + n1 + n2 - 1 由此, n0 = n2 + 1,性 质 4具有n个结点的完全二叉树的深度 为log2n +1,证明,设完全二叉树的深度为 k 则根据第二条性质得 2k-1 n 2k 即 k-1 log2 n k 因为k只能是整数,因此,k=log2n +1,性 质 5,若对含n个结点的完全二叉树从 上到下且从左至右进行1至n的编号, 则对完全二叉树中任
10、意一个编号为i 的结点:,(1)若i=1,则该结点是二叉树的根,无双亲,否则,编号为i/2 的结点为其双亲结点(2)若2in,则该结点无左孩子,否则,编号为2i的结点为其左孩子结点(3)若2i+1n,则该结点无右孩子结点,否则,编号为2i+1的结点为其右孩子结点,树的存储结构,一、广义表表示法 二、双亲表示法 三、孩子表示法 四、孩子兄弟表示法,广义表表示法,树的广义表表示(结点的utype域没有画出),A,B,C,D,E,F,G,0 A -1 1 B 0 2 C 0 3 D 0 4 E 2 5 F 2 6 G 5,data parent,双亲表示法,A,B,C,D,E,F,G,0 A -1
11、1 B 0 2 C 0 3 D 0 4 E 2 5 F 2 6 G 4,data firstchild,1 2 3,4 5,6,孩子链表表示法,A,B,C,D,E,F,G,A BCE DFG,root,A BCE DFG,孩子兄弟表示法,孩子兄弟表示法,data,firstChild,nextSibling,二叉树的存储结构,二、二叉树的链式存储表示,一、二叉树的顺 序存储表示,完全二叉树的 一般二叉树的 数组表示 数组表示,顺序存储表示,A,B,C,D,E,F,A B D C E F,0 1 2 3 4 5 6 7 8 9 10 11 12 13,1,4,0,13,2,6,单支树,由于一般二
12、叉树必须仿照完全二叉树那样存储,可能会浪费很多存储空间,单支树就是一个极端情况,A,D,E,B,C,F,root,lchild data rchild,结点结构,二叉链表,链表表示,A,D,E,B,C,F,root,三叉链表,parent lchild data rchild,结点结构,二叉链表的静态结构,森林与二叉树 的转换,森林转化成二叉树 的规则, 若F为空,即n = 0,则对应的二叉树B为空二叉树 若F不空,则对应二叉树B的根root(B)是F中第一棵树T1的根root(T1),其左子树为B(T11, T12, , T1m),其中,T11, T12, T1m是root(T1)的子树;其
13、右子树为B(T2, T3, , Tn),其中,T2, T3, , Tn是除T1外其它树构成的森林,二叉树转换为森林的规则, 如果B为空,则对应的森林F也为空 如果B非空,则F中第一棵树T1的根为root;T1的根的子树森林(T11, T12, , T1m ) 是由root的左子树LB转换而来,F 除了T1之外其余的树组成的森林(T2, T3, ,Tn )是由root的右子树RB转换而成的森林,森林与二叉树的转换,二叉树遍历 (Binary Tree Traversal),顺着某一条搜索路径巡访二叉树 中的结点,使得每个结点均被访问一 次,而且仅被访问一次,问题的提出,“访问”的含义可以很广,如
14、:输出结 点的信息等,“遍历”是任何类型均有的操作, 对线性结构而言,只有一条搜索路 径(因为每个结点均只有一个后继), 故不需要另加讨论。而二叉树是非 线性结构,每个结点有两个后继, 则存在如何遍历即按什么样的搜索 路径遍历的问题,对“二叉树”而言,可以有三条搜索路径,1先上后下的按层次遍历 2先左(子树)后右(子树)的遍历 3先右(子树)后左(子树)的遍历,设 访问根结点 记作 V遍历根的左子树 记作 L遍历根的右子树 记作 R则可能的遍历次序有前序 VLR 逆前序 VRL中序 LVR 逆中序 RVL后序 LRV 逆后序 RLV 层次遍历,前序遍历 (Preorder Traversal)
15、,若二叉树为空,则空操作 否则 访问根结点(V) 前序遍历左子树(L) 前序遍历右子树(R)遍历结果 - + a * b - c d / e f,若二叉树为空,则空操作 否则 中序遍历左子树(L) 访问根结点(V) 中序遍历右子树(R)遍历结果 a + b * c - d - e / f,中序遍历 (Inorder Traversal),表达式语法树,后序遍历 (Postorder Traversal),若二叉树为空,则空操作 否则 后序遍历左子树(L) 后序遍历右子树(R) 访问根结点(V)遍历结果 a b c d - * + e f / -,层次遍历(Levelorder Traversa
16、l),从上到下,从左到右遍历结果 - a* e f b -cd,按给定的表达式建相应二叉树,由前缀表达式建树 例如: -+abc/de,由中缀表达式建树例如:(a+b)cd/e,由后缀表达式建树 例如: ab+cde/-,对应前缀表达式 -+abc/de的二叉树,a,b,c,d,e,-,+,/,特点:操作数为叶子结点运算符为分支结点,对应中缀表达式 (a+b)c-d/e的二叉树,a,b,c,d,e,-,+,/,特点:操作数为叶子结点运算符为分支结点,对应后缀表达式 ab+cde/-的二叉树,a,b,c,d,e,-,+,/,特点:操作数为叶子结点运算符为分支结点,a+b,(a+b)c d/e,a
17、+bc,分析表达式和二叉树的关系,a,b,+,a,b,c,+,a,b,c,+,(a+b)c,a,b,c,d,e,-,+,/,二叉树的计数,由二叉树的前序序列和中序序列可以唯一地确定一棵二叉树由二叉树的后序序列和中序序列可以唯一地确定一棵二叉树由二叉树的前序序列和后序序列不可唯一地确定一棵二叉树,仅知二叉树的先序序列“abcdefg” 不能唯一确定一棵二叉树,,由二叉树的先序和中序序列建树,如果同时已知二叉树的中序序列“cbdaegf”,则会如何?,二叉树的先序序列,二叉树的中序序列,左子树,左子树,右子树,右子树,根,根,a b c d e f g,c b d a e g f,a,a,b,b,
18、c,c,d,d,e,e,f,f,g,g,a,b,c,d,e,f,g,先序序列中序序列,前序序列ABHFDECKG 中序序列HBDFAEKCG,如果前序序列固定不变,给出不同的中序序列,可得到不同的二叉树,问题是有n个数据值,可能构造多少种不同的二叉树?我们可以固定前序排列,选择所有可能的中序排列,有 3 个数据 1, 2, 3 ,可得5种不同的二叉树。它们的前序排列均为123,中序序列可能是 123,132,213,231,321,有0个, 1个, 2个, 3个结点的不同二叉树如下,具有4个结点的不同二叉树,计算具有n个结点的不同二叉树的棵数,Catalan函数,树 的 遍 历,深度优先遍历
19、树的先根次序遍历 树的后根次序遍历广度优先遍历 树的层次次序遍历,AB C DE F GHI J K,先根遍历,A B E F C D G H I J K,后根遍历,E F B C I J K H G D A,层次遍历:,A B C D E F G H I J K,B C DE F GHI J K,1森林中第一棵树的根结点,2森林中第一棵树的子树森林,3森林中其它树构成的森林,森林由三部分构成,森林的先根遍历,森林的二叉树表示,若森林F为空, 返回 否则:访问F的第一棵树的根结点先根次序遍历第一棵树的子树森林先根次序遍历其它树组成的森林,森林的后根遍历,森林的二叉树表示,若森林F为空,返回 否
20、则:后根次序遍历第一棵树的子树森林后根次序遍历其它树组成的森林访问F的第一棵树的根结点,森林的层次遍历,森林的二叉树表示,若森林F为空,返回 否则:依次遍历各棵树的根结点依次遍历各棵树根结点的所有子女依次遍历这些子女结点的子女结点,二叉树的类定义,template class BinTreeNode private:BinTreeNode *LChild,*RChild; Type data; ; template class BinaryTree private:BinTreeNode *root; ;,二叉树前序遍历递归算法 template void BinaryTree:PreOrde
21、r(BinTreeNode*current) if ( current != NULL ) cout currentdata;PreOrder ( currentLChild );PreOrder ( currentRChild ); ,二叉树中序遍历递归算法 template void BinaryTree : InOrder(BinTreeNode*current) if ( current != NULL ) InOrder ( currentLChild );cout currentdata;InOrder ( currentRChild ); ,二叉树后序遍历递归算法 templat
22、e void BinaryTree: PostOrder(BinTreeNode*current) if ( current != NULL ) PostOrder ( currentLChild );PostOrder ( currentRChild );cout currentdata; ,二叉树前序遍历 非递归算法,template void BinaryTree:PreOrder(BinTreeNode *p ) do while ( p != NULL ) cout pdata;Push ( s, p ); p = pLChild; if ( !Empty ( s ) ) p = p
23、op ( s ); p = pRChild; while ( ( !Empty ( s ) ) | ( p != NULL ) ) ,二叉树中序遍历 非递归算法,template void BinaryTree:PreOrder(BinTreeNode *p ) do while ( p != NULL ) Push ( s, p ); p = pLChild; if ( !Empty ( s ) ) p = pop ( s ); cout pdata;p = pRChild; while ( ( !Empty ( s ) ) | ( p != NULL ) ) ,应用二叉树遍历的事例,计算二
24、叉树结点个数的一种方法,template int BinaryTree:Size ( BinTreeNode *t ) if ( t = NULL ) return 0;else return 1 + Size ( tLChild )+ Size ( tRChild ); ,计算二叉树的高度,template int BinaryTree:Depth ( BinTreeNode *t ) if ( t = NULL ) return 0;else return 1+Max( Depth( tLChild ), Depth( tRChild ) ); ,线索二叉树,遍历二叉树的结果是,求得结点的
25、一个线性序列,A,B,C,D,E,F,G,H,K,先序序列A B C D E F G H K,中序序列B D C A H G K F E,后序序列D C B H K G F E A,指向该线性序列中的“前驱”和“后继” 的指针,称作“线索”,与其相应的二叉树, 称作 “线索二叉树”,包含 “线索” 的存储结构,称作 “线索链表”,A B C D E F G H K, D ,C , B,E ,对线索链表中结点的约定,在二叉链表的结点中增加两个标志域 LTag和RTag,并作如下规定:,若该结点的左子树不空, 则LChild域的指针指向其左孩子,且左标志LTag的值为0 否则,LChild域的指针
26、指向其“前驱”,且左标志LTag的值为1,若该结点的右子树不空, 则RChild域的指针指向其右孩子,且右标志RTag的值为0 否则,RChild域的指针指向其“后继”,且右标志RTag的值为1,如此定义的二叉树的存储结构称作“线索链表”,LTag = 0, LChild为指针,指向左孩子 LTag = 1, LChild为线索,指向前驱 RTag = 0, RChild为指针,指向右孩子 RTag = 1, RChild为线索,指向后继,猜一猜,是哪一种线索二叉树,后序序列D B E C A,前序序列A B D C E,带表头结点的中序线索二叉树,寻找当前结点 在中序下的后继,if (pRT
27、ag=1) if (pRChild!=T.root)后继为 pRChildelse 无后继 else /pRTag=0 if (pRChild!=T.root)后继为当前结点右 子树的中序下的第 一个结点else 出错情况,A,B,D,E,C,F,H,I,K,G,J,L,寻找当前结点 在中序下的前趋,if (pLTag=1)if (pLChild!=T.root)前驱为pLChild else 无前驱 else /pLTag=0if (pLChild!=T.root)前驱为当前结点左子树的中序下的最 后一个结点else 出错情况,A,B,D,E,C,F,H,I,K,G,J,L,在前序线索化二叉
28、树中寻找当前结点的后继,在前序线索化二叉树中寻找当前结点的前趋,在后序线索化二叉树中寻找当前结点的后继,在后序线索化二叉树中寻找当前结点的前趋,堆 ( Heap ),template class MinPQ public:Virtual void Insert ( const Type 最小优先级队列类的定义,优先级队列每次出队列的是优先权最高的元素,堆的定义,完全二叉树的数组表示Ki K2i+1 &Ki K2i+2,完全二叉树的数组表示Ki K2i+1 &Ki K2i+2,最小堆的类定义template class MinHeap :public MinPQ public: MinHeap
29、( int maxSize ) const;MinHeap ( Type arr , int n );MinHeap ( ) delete heap; const MinHeap ,int IsFull ( ) const return CurrentSize = MaxHeapSize; void MakeEmpty ( ) CurrentSize = 0; private: enum DefaultSize = 10 ;Type *heap; int CurrentSize; int MaxHeapSize;void FilterDown ( int i, int m );void Fil
30、terUp ( int i ); ,堆的建立,template MinHeap : MinHeap ( int maxSize ) /根据给定大小maxSize,建立堆对象MaxHeapSize = DefaultSize MinHeap : MinHeap ( Type arr , int n ) /根据给定数组中的数据和大小,建立堆对象,MaxHeapSize = DefaultSize = 0 ) /从下到上逐步扩大,形成堆FilterDown ( currentPos, CurrentSize );/从currentPos开始,到CurrentSize为止, 调整currentPos-
31、; ,自下向上逐步调整为最小堆,将一组用数组存放的任意数据调整成堆,最小堆的向下调整算法template void MinHeap: FilterDown ( const int start, const int EndOfHeap ) int i = start, j = 2*i+1; / j 是 i 的左子女Type temp = heapi;while ( j heapj+1.key ) j+; /两子女中选小者if ( temp.key = heapj.key ) break;else heapi = heapj; i = j; j = 2*j+1; heapi = temp; ,堆的
32、插入,template int MinHeap: Insert ( const Type ,template void MinHeap: FilterUp ( int start ) /从 start 开始,向上直到0,调整堆int j = start, i = (j-1)/2; / i 是 j 的双亲Type temp = heapj;while ( j 0 ) if ( heapi.key = temp.key ) break;else heapj = heapi; j = i; i = (i -1)/2; heapj = temp; ,最小堆的向上调整,template int MinH
33、eap : RemoveMin ( Type ,哈 夫 曼 树 (Huffman Tree) 与 哈 夫 曼 编 码,设给出一段报文 CAST CAST SAT AT A TASA字符集合是 C, A, S, T ,各个字符出现的频度(次数)是 W 2, 7, 4, 5 若给每个字符以等长编码 A : 00 T : 10 C : 01 S : 11 则总编码长度为 ( 2+7+4+5 ) * 2 = 36,若按各个字符出现的概率不同而给予不等长编码,可望减少总编码长度 A : 0 T : 10 C : 110 S : 111 它的总编码长度为7*1+5*2+( 2+4 )*3 = 35 比等长
34、编码的情形要短,结点的路径长度从根结点到该结点的路径上分 支的数目,结点间路径长度(Path Length)连接两结点的路径上的分支数,树的带权路径长度 (Weighted Path Length,WPL)树的各叶结点所带的权值与该结点到根的路径长度的乘积的 和,树的路径长度树中每个结点的路径长度之和,在所有含n个叶子结点、并带相同 权值的m叉树中,必存在一棵其带权路 径长度取最小值的树,称为“最优树”, 或“哈夫曼树” (Huffman Tree),具有不同带权路径长度的二叉树,哈夫曼树中,权值大的结点离根最近,2,7 9,7,5,4,9,2,WPL(T)= 72+52+23+43+92 =
35、60,WPL(T)= 74+94+53+42+21 =89,5,4,构造哈夫曼树,(以二叉树为例),根据给定的 n 个权值 w1, w2, , wn,造 n 棵二叉树的集合F = T1, T2, , Tn,其中每棵二叉树中均只含一个带权值为 wi 的根结点,其左、右子树为 空树;,(1),在 F 中选取其根结点的权值为最小的两棵二叉树,分别作为左、 右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和;,(2),从F中删去这两棵树,同时加入刚生成的新树,重复 (2) 和 (3) 两步,直至 F 中只含一棵树为止,(3),(4),9,已知权值 W= 5, 6,
36、2, 9, 7 ,5,6,2,7,5,2,7,6,9,7,6,7,13,9,5,2,7,6,7,13,9,5,2,7,9,5,2,7,16,6,7,13,29,0,0,0,0,1,1,1,1,00,01,10,110,111,哈夫曼树的构造过程,哈夫曼树的构造过程,任何一个字符的编码都不是同一 字符集中另一个字符的编码的前缀,前缀编码,利用哈夫曼树可以构造一种不等长的二进制编码,并且构造所得的哈夫曼编码是一种最优前缀编码,即使所传电文的总长度最短,设给出一段报文 CAST CAST SAT AT A TASA字符集合是 C, A, S, T ,各个字符出现的频度(次数)是 W 2, 7, 4,
37、 5 若给每个字符以等长编码 A : 00 T : 10 C : 01 S : 11 则总编码长度为 ( 2+7+4+5 ) * 2 = 36,以各字符出现概率2,7,4,5为各叶结点权值,建立哈夫曼树,得哈夫曼编码(不等长编码) A:0 T:10 C:110 S:111 总编码长度为 7*1+5*2+(2+4)*3=35 总编码长度正好等 于哈夫曼树的带 权路径长度WPL,哈夫曼树的应用,(1)判定树 在解决某些判定问题时,利用哈夫曼树可以得到最佳判定算法。 例1 将学生百分成绩按分数段分级的程序。 若学生成绩分布是均匀的,可用图(a)二叉树结构来实现。,输入10000个数据,则需进行315
38、00次比较。,10000个学生成绩转换成五分制的判定,A60,A70,A80,A90,不及格,优秀,及格,中等,良好,Y,N,Y,Y,Y,N,N,N,500*1+1500*2+4000*3+3000*4+1000*4 =31500,(b),学生成绩分布不是均匀的情况:,以比例数为权构造一棵哈夫曼树,如(b)判断树所示。,再将每一比较框的两次比较改为一次,可得到(c)判定树。,输入10000个数据,仅需进行22000次比较。,A60,A70,A80,A90,不及格,优秀,及格,中等,良好,Y,N,Y,Y,Y,N,N,N,用此形式比较次数为: 500*3+1500*3+4000*2+3000*2+
39、1000*2=22000,各字符编码是 T ; A C S00 01 10 110 111 上述电文编码: 11010111011101000011111000011000,方法: (1)用 2,4, 2,3, 3 作为叶子结点的权值生成一棵哈夫曼树,并将对应权值wi的叶子结点注明对应的字符; (2)约定左分支表示字符“0”,右分支表示字符1 (3)从叶子结点开始,顺着双亲反推上去,直到根结点,路径上的0或1连接的序列就是结点对应的字符的二进制编码的逆序。,(2)哈夫曼编码-利用哈夫曼树构造通讯中电文编码(前缀码) 例2:要传输的电文是CAS;CAT;SAT;AT 要传输的字符集是 D=C,A
40、,S,T, ; 每个字符出现的频率是W= 2,4, 2,3, 3 ,注意:编码的总长度恰好为哈夫曼树的带权路径长。,1. 熟练掌握二叉树的结构特性,了解相应的证明方法。2. 熟悉二叉树的各种存储结构的特点及适用范围。3. 遍历二叉树是二叉树各种操作的基础。实现二叉树遍历的具体算法与所采用的存储结构有关。掌握各种遍历策略的递归算法,灵活运用遍历算法实现二叉树的其它操作。层次遍历是按另一种搜索策略进行的遍历。,4. 理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系,熟练掌握二叉树的线索化过程以及在中序线索化树上找给定结点的前驱和后继的方法。二叉树的线索化过程是基于对二叉树进行遍历,而线索二叉树上的线索又为相应的遍历提供了方便。,5. 熟悉树的各种存储结构及其特点,掌握树和森林与二叉树的转换方法。建立存储结构是进行其它操作的前提,因此读者应掌握 1 至 2 种建立二叉树和树的存储结构的方法。6. 学会编写实现树的各种操作的算法。 7. 了解最优树的特性,掌握建立最优树和哈夫曼编码的方法。,