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