#include<stdio.h>
#include<stdlib.h>
typedef enum PointerTag
{
Thread,
Point
};
typedef struct node
{
char data;
PointerTag lTag,rTag;
struct node* lChild;
struct node* rChild;
}Tree,TreeNode,*BinTree;
BinTree pre;
int creatTree(BinTree& pTree)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
{
pTree=NULL;
}
else
{
pTree=(BinTree)malloc(sizeof(Tree));
pTree->data=ch;//生成父节点
pTree->lTag=Point;
pTree->rTag=Point;//在线索化的时候,把一部分tag改成Thread
creatTree(pTree->lChild);//建立左子数
creatTree(pTree->rChild);//建立右子数
return 0;
}
}
void inThreading(BinTree tree)//中序线索二叉树
{
if(tree)
{
inThreading(tree->lChild);
if(!(tree->lChild))
{
tree->lTag=Thread;
tree->lChild=pre;
}
if(!(pre->rChild))
{
pre->rTag=Thread;
pre->rChild=tree;
}
pre=tree;
inThreading(tree->rChild);
}
}
void inOrderThreading(BinTree& pHead,BinTree tree)
{
pHead=(BinTree)malloc(sizeof(Tree));
pHead->lTag=Point;//初始化pHead的标签
pHead->rTag=Thread;
pHead->lChild=tree;//头的左指针指树
pHead->rChild=pHead;//头的右指针回指 (先不让pHead->rChild为空,最后再让它指向遍历的最后一个节点)
if(!tree)
{
pHead->lChild=pHead;//如果树是空树,那么pHead左指针回指
}
else
{
pre=pHead;
inThreading(tree);//遍历完成,这时pre指向遍历的最后一个节点
pre->rTag=Thread;//最后一个节点线索化,把最后一个节点的rChild指向pHead。注意:只有先序和中序遍历时,最后一个访问的节点的rTag才是Thread
pre->rChild=pHead;
pHead->rChild=pre;//把pHead的rChild指向遍历的最后一个节点 (形成一个环)
}
}
int travelTree(BinTree pHead)//二叉树的中序线索遍历
{
BinTree p;
p=pHead->lChild;
while(p!=pHead)
{
while(p->lTag!=Thread)
{
p=p->lChild;
}
printf("%c",p->data);
while((p->rTag==Thread)&&(p->rChild!=pHead))
{
p=p->rChild;
printf("%c",p->data);
}
p=p->rChild;
}
return 0;
}
//某个节点的后继是其右子树的最后一个节点,也就是右子树最左下的节点
int main()
{
BinTree pHead=NULL,tree=NULL;
creatTree(tree);
preOrderTraversal(tree);
return 0;
}
中序线索二叉树
最新推荐文章于 2021-11-29 14:58:45 发布