1、1 1一、线索二叉树一、线索二叉树定义:线索、线索化、线索二叉树定义:线索、线索化、线索二叉树 在一个在一个n结点的链式存储二叉树中,有结点的链式存储二叉树中,有n+1个指个指针域是空指针域,可以把每个空指针域用于存放分针域是空指针域,可以把每个空指针域用于存放分别指向某种遍历次序的前趋和后继结点的指针。别指向某种遍历次序的前趋和后继结点的指针。在结点的空指针域中存放的该结点在某遍历次在结点的空指针域中存放的该结点在某遍历次序下的前趋结点和后继结点的指针序下的前趋结点和后继结点的指针叫做线索叫做线索。2 2遍历二叉树的结果是,遍历二叉树的结果是,求得结点的一个线性序列求得结点的一个线性序列AB
2、CDEFGHK先序序列先序序列 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 A3 3指向该线性序列中的指向该线性序列中的“前驱前驱”和和 “后继后继”的指针,称作的指针,称作“线索线索”与其相应的二叉树,与其相应的二叉树,称作称作 “线索二叉树线索二叉树”包含包含 “线索线索”的存储结构,的存储结构,称作称作 “线索链表线索链表”A B C D E F G H K D C B E 4 4定义:线索、线索化、线索二叉树定义:线索、线索化、线索二叉树 把某结点原来空的左(右)指针域用于存把某结点原来空的左(
3、右)指针域用于存放指向其前趋(后继)结点的指针,也叫放指向其前趋(后继)结点的指针,也叫左左(右)线索(右)线索。对一个二叉树中的所有结点的空指针域按对一个二叉树中的所有结点的空指针域按照某种遍历次序加线索的过程叫作照某种遍历次序加线索的过程叫作线索化线索化,被,被线索化了的二叉树称作线索化了的二叉树称作线索二叉树。线索二叉树。一、线索二叉树一、线索二叉树5 5增加两个标志域:增加两个标志域:0 leftChild域指示结点的左孩子域指示结点的左孩子1 leftChild域指示结点的前驱域指示结点的前驱0 rightChild域指示结点的右孩子域指示结点的右孩子1 rightChild域指示结
4、点的后继域指示结点的后继 leftTag =rightTag=leftChild leftTag data rightTag rchildChild一、线索二叉树一、线索二叉树6 6中序线索二叉树:中序线索二叉树:图中的虚线箭头即为新加上的线索。图中的虚线箭头即为新加上的线索。一、线索二叉树一、线索二叉树7 7后序序列后序序列 D B E C A前序序列前序序列 A B D C E一、线索二叉树一、线索二叉树8 8带表头结点的中序线索二叉树带表头结点的中序线索二叉树一、线索二叉树一、线索二叉树9 9实战:实战:1、对于下图二叉树,画出其前序线索二叉树、对于下图二叉树,画出其前序线索二叉树、中序
5、线索二叉树和后序线索二叉树。中序线索二叉树和后序线索二叉树。A A E E D D C C B B F F G G H H 2、n个结点的线索二叉树上含有线索数为()个结点的线索二叉树上含有线索数为()A 2n B n-1 C n+1 D n1010(1)中序线索化中序线索化对一个二叉树进行中序线索化的算法对一个二叉树进行中序线索化的算法基本思想基本思想是:是:一边中序遍历一边建立线索。一边中序遍历一边建立线索。a)若访问结点的左孩子结点为空,则建立若访问结点的左孩子结点为空,则建立前趋线索前趋线索;b)若右孩子结点为空,则建立若右孩子结点为空,则建立后继线索后继线索。为此附设一个指针为此附设
6、一个指针pre始终指向刚刚访问过的结始终指向刚刚访问过的结点,而用指针点,而用指针cur指示当前正在访问的结点。指示当前正在访问的结点。pre的初始值为的初始值为NULL。一、线索二叉树一、线索二叉树1111中序线索化算法中序线索化算法一、线索二叉树一、线索二叉树void InThreadHelp(ThreadBinTreeNode*cur,ThreadBinTreeNode*&pre)if(cur!=NULL)if(cur-leftTag=CHILD_PTR)InThreadHelp(cur-leftChild,pre);if(cur-leftChild=NULL)cur-leftChild
7、=pre;cur-leftTag=THREAD_PTR;elsecur-leftTag=CHILD_PTR;1212中序线索化算法中序线索化算法一、线索二叉树一、线索二叉树if(pre!=NULL&pre-rightChild=NULL)pre-rightChild=cur;pre-rightTag=THREAD_PTR;else if(pre!=NULL)pre-rightTag=CHILD_PTR;pre=cur;if(cur-rightTag=CHILD_PTR)InThreadHelp(cur-rightChild,pre);1313(2)中序线索树求后继结点中序线索树求后继结点在中序
8、遍历线索树过程中,按下述两条原则即可在中序遍历线索树过程中,按下述两条原则即可找到后继结点:找到后继结点:a)如果某结点的如果某结点的右线索标志域为右线索标志域为1,说明其右指针域,说明其右指针域是线索,这个线索所指的即是该结点的后继结点;是线索,这个线索所指的即是该结点的后继结点;b)如果某结点的如果某结点的右线索标志为右线索标志为0,则其右指针域是指,则其右指针域是指向右儿子结点的指针,由此结点的右儿子结点起按左向右儿子结点的指针,由此结点的右儿子结点起按左指针域指针逐结点向左查找,一直找到左线索标志域指针域指针逐结点向左查找,一直找到左线索标志域为为1的结点,即是该结点的后继结点。的结点
9、,即是该结点的后继结点。一、线索二叉树一、线索二叉树1414(3)中序线索树求前趋结点中序线索树求前趋结点找前趋结点相应的原则如下:找前趋结点相应的原则如下:a)如果某结点的如果某结点的左线索标志域为左线索标志域为1,说明其左指针域,说明其左指针域是线索,这个线索所指的即是该结点的前趋结点;是线索,这个线索所指的即是该结点的前趋结点;b)如果某结点的如果某结点的左线索标志为左线索标志为0,则其左指针域是指,则其左指针域是指向左儿子结点的指针,由此结点的左儿子结点起按右向左儿子结点的指针,由此结点的左儿子结点起按右指针域指针逐结点向右查找,一直找到右线索标志域指针域指针逐结点向右查找,一直找到右
10、线索标志域为为1的结点,即是该结点的前趋结点。的结点,即是该结点的前趋结点。一、线索二叉树一、线索二叉树1515(4)中序遍历线索树中序遍历线索树 P217a)先由根结点指针找到根结点,从根结点起沿先由根结点指针找到根结点,从根结点起沿左指针逐结点一直向左查找,找到左线索标志左指针逐结点一直向左查找,找到左线索标志为为1的结点的结点(“最左最左”的结点的结点)即为遍历中需首先即为遍历中需首先访问的结点。访问的结点。b)由此结点开始,反复进行寻找后继结点的过由此结点开始,反复进行寻找后继结点的过程,并陆续访问这些结点,直至结束。程,并陆续访问这些结点,直至结束。一、线索二叉树一、线索二叉树161
11、6template void InThreadBinTree:InOrder(void(*Visit)(const ElemType&)if(r!=NULL)ThreadBinTreeNode *cur=root;while(cur-leftTag=CHILD_PTR)cur=cur-leftChild;中序线索二叉树的遍历算法中序线索二叉树的遍历算法1717while(cur!=NULL)(*visit)(cur-data);if(cur-rightTag=THREAD_PTR)cur=cur-rightChild;elsecur=cur-rightChild;while(cur-leftChild=CHILD_PTR)cur=cur-leftChild;中序线索二叉树的遍历算法中序线索二叉树的遍历算法1818本本 讲讲 小小 结结重点:重点:1、线索二叉树、线索二叉树难点:难点:1、线索二叉树的应用、线索二叉树的应用1919Homework:q 1、写写算法算法求中序线索二叉树中给定值为求中序线索二叉树中给定值为x的结点之后继结点,返回该后继结点的指针的结点之后继结点,返回该后继结点的指针。(请编程实现)(请编程实现)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1