线索二叉树的建立与遍历

Posted yy-1046741080

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线索二叉树的建立与遍历相关的知识,希望对你有一定的参考价值。

线索二叉树利用二叉树空余的指针域,来实现二叉树的链式化。然后,就可以通过前驱,后继像双向链表一样根据某种遍历次序对树的结点进行访问。

 


数据结构:

1 struct node
2     int data;
3     struct node* left,*right;
4     int ltag,rtag;  //=0时,表明指向子结点;=1时,表示指向前驱/后继
5 

 


 

建立线索二叉树:

  • 不同的遍历顺序,会得到不同的线索二叉树。
  • 一般使第线索链表的头和尾指向NULL(也可以加入一个头指针)

 

以中序遍历为例:(对左子树处理,对该结点处理,对右子树处理)

 1 // p:当前结点,pre:前驱结点   ;  对每一个点进行处理(NULL,ltag=0,ltag=1)
 2 void CreateNode(node &p,node& pre)
 3     if(p!=NULL)
 4         CreateNode(p->left,pre);    // pre进行递归改变!!!   对左子树进行处理
 5         // 左子树为空
 6         if(p->left==NULL)
 7             p->left=pre;
 8             p->ltag=1;
 9             
10         // 建立前驱结点的后继线索
11         if(pre!=NULL && pre->right!=NULL)
12             pre->right=p;
13             pre->rtag=1;
14         
15         pre=p;
16         CreateNode(p->right,pre);   // 对右子树处理
17     
18 
19 
  // 建树 20 void CreateTree(node* root) 21 node* pre=NULL; 22 if(root!=NULL) 23 CreateNode(root,pre); 24 pre->right=NULL; // 遍历最后结点 25 pre->rtag=1; 26 27

 


 

线索二叉树的遍历:

  1. 需要找到线索链表的头结点,在中序和后序遍历中,头结点为最左结点;在先序遍历中,头结点为根结点;
  2. 然后就可以根据rtag的值来访问整个序列。

 

以中序为例:

 1 // 寻找中序遍历第一个结点
 2 node* FirstNode(node* root)
 3     while(root->left!=NULL)
 4         root=root->left;
 5     
 6     return root;
 7 
 8 
 9 // 获得该结点的下一个结点
10 node* GetNextNode(node* p)
11     if(p->rtag==0)
12         return FirstNode(p->right);   // 对于有右子树的根结点而言,后面第一个结点是右子树的最左结点
13     
14     else
15         return p->right;
16     
17 
18 
19 // 中序遍历
20 void Inorder(node* root)
21     for(node* p=FirstNode(root);p!=NULL;p=GetNextNode(p))
22         ; // 处理
23     
24 

 

以上是关于线索二叉树的建立与遍历的主要内容,如果未能解决你的问题,请参考以下文章

线索二叉树

线索二叉树

二叉树的建立及线索二叉树的实现

算法系列之线索化二叉树,前序线索化中序线索化后序线索化以及遍历~

C语言数据结构与算法----树和二叉树全面总结(中)

数据结构-树线索二叉树