数据结构(十五) 线索二叉树讲解(带头节点中序加线索) 以及实现的完整代码

来源:互联网 发布:mysql触发器的作用 编辑:程序博客网 时间:2024/04/29 01:47

这篇博客主要讲解的是前序线索化的基础上加上头节点(中序类似),这样做的好处是可以让所有的指针都不为空(即都有指向)。

下篇博客主要讲解后序加上线索化,这个有一定的难度。

实现的代码如下:

//带头节点的二叉树的前序线索化 #include <iostream>using namespace std;//二叉树的结构体typedef struct Node{char data;int ltag;int rtag;struct Node *lchild;struct Node *rchild;}*BiTree; BiTree pre;//前序创建二叉树void createBiTree(BiTree &Tree){char data;cin>>data;if(data=='#'){Tree = NULL;}else{Tree = new Node();Tree->data = data;Tree->ltag=0;Tree->rtag=0;createBiTree(Tree->lchild);createBiTree(Tree->rchild);}}//前序加线索化的函数 void preThreading(BiTree &Tree){if(Tree){if(Tree->lchild==NULL){Tree->ltag=1;Tree->lchild=pre;}if(pre->rchild==NULL){pre->rtag=1;pre->rchild=Tree;}pre = Tree;if(Tree->ltag==0){preThreading(Tree->lchild);}if(Tree->rtag==0){preThreading(Tree->rchild);}}}//前序线索化,加上头节点void preXianBiTree(BiTree Tree,BiTree &Thrt){Thrt = new Node();Thrt->ltag = 0;Thrt->rtag = 1;Thrt->rchild=Thrt;if(Tree==NULL){Thrt->lchild=Thrt;}else{Thrt->lchild=Tree;pre = Thrt;preThreading(Tree);pre->rchild=Thrt;pre->rtag=1;Thrt->rchild=pre;}} //遍历前序加线索化的函数void preBiTree(BiTree Tree){BiTree p;p = Tree->lchild;while(p!=Tree){while(p->lchild!=NULL&&p->ltag==0){cout<<p->data<<" ";p = p->lchild;}cout<<p->data<<" ";if(p->ltag==1){p = p->rchild;}while(p!=Tree){if(p->lchild!=NULL&&p->ltag==0){break;}cout<<p->data<<" ";p = p->rchild;}}} int main(){BiTree Tree,Thrt;cout<<"请输入你要创建的二叉树的数据(按先序遍历创建的二叉树#为空节点的表示)\n";createBiTree(Tree);pre = new Node();pre->rchild=NULL;preXianBiTree(Tree,Thrt);preBiTree(Thrt);return 0;}


0 0