首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

二叉树的线索化,该如何解决

2012-02-04 
二叉树的线索化C/C++ codevoid InThreading(BiThrTree p){if(p){InThreading(p - lchild) //左子数线索

二叉树的线索化

C/C++ code
void InThreading(BiThrTree p){    if(p)    {        InThreading(p -> lchild); //左子数线索化        if(!p -> lchild) { p->LTag = Thread; p->lchild = pre; } //前驱线索        if(!pre -> rchild) { pre->RTag = Thread; pre->rchild = p; } // 后继线索        pre = p;  //保持pre指向p的前驱        InThreading(p -> lchild); //右子树线索化    }}

按照中序遍历线索化二叉树。
摘自数据结构与算法,严蔚敏。左子树线索化和右子树线索化能不能调换位置?

[解决办法]
为什么要调换位置?
中序遍历本来就那样
先左,后中,最后右
[解决办法]
我刚做的哈。
测试数是421##3##65##7##

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

typedef struct tree
{
char info;
int leftThread;
int rightThread;
struct tree *lchild;
struct tree *rchild;
}BinTNode,*BinTree;

BinTree prior;

void InThread(BinTree T)
{
if(T!=NULL)
{
InThread(T->lchild);
if(T->rchild==NULL)
T->rightThread=0;
if(T->lchild==NULL)
{
T->lchild=prior;
T->leftThread=0;
}
if(T->rightThread==1)
prior->rchild=T;
prior=T;
InThread(T->rchild);
}
}

BinTree ThreadTree(BinTree T)
{
BinTree q;
q=(BinTree)malloc(sizeof(BinTNode));
if(q==NULL)
printf("out of space.\n");
q->info='@';
q->leftThread=1;
q->rightThread=1;
q->rchild=q;
if(T==NULL)
q->lchild=q;
else
{
q->lchild=T;
prior=q;
InThread(T);
prior->rchild=q;
prior->rightThread=0;
}
return q;
}

BinTree CreatBinTree()
{
BinTree T;
char ch;
if((ch=getchar())=='#')
return NULL;
else
{
T=(BinTree)malloc(sizeof(BinTNode));
T->info=ch;
T->leftThread=1;
T->rightThread=1;
T->lchild=CreatBinTree();
T->rchild=CreatBinTree();
return T;
}
}

BinTree FinInPrior(BinTree T)
{
BinTree S;
S=T->lchild;
if(T->leftThread==1)
{
printf("\nLeftchild is pointer\n");
while(S->rightThread==1)
{
S=S->rchild;
}
printf("\nIts prior is %c\n",S->info);
}
else if(T->leftThread==0)
{
printf("\nLeftChild is thread:its prior is %c\n",S->info);
}
return S;
}

BinTree FinInSucc(BinTree T)
{
BinTree S;
S=T->rchild;
if(T->rightThread==1)
{
printf("\nRightChild is pointer\n");
while(S->leftThread==1)
{
S=S->lchild;
}
printf("\nIts successor is %c\n",S->info);
}
else if(T->leftThread==0)
{
printf("\nRightChild is thread: its successor is %c\n",S->info);

}
return S;
}

void TreeSearch(BinTree T)
{
char ch;
ch=getchar();
if(ch=='$')
{
printf("\nThe data your want is :%c\n",T->info);
FinInPrior(T);
FinInSucc(T);
}
else
{
if(ch=='l')
TreeSearch(T->lchild);
else if(ch=='r')
TreeSearch(T->rchild);
}


return;
}

void PrintTree(BinTree T)
{
if(T!=NULL)
{
PrintTree(T->lchild);
printf("%c",T->info);
PrintTree(T->rchild);
}
}

void main()
{
char answer='y';
BinTree H,T1;
BinTree T=CreatBinTree();
printf("\nThe original Tree is :\n\n");
PrintTree(T);
H=ThreadTree(T);
do
{
printf("\n\nSearch beginning:\n");
printf("\nInput instrution*like rl$ rl$* : ");
flushall();
T1=H->lchild;
TreeSearch(T1);
printf("\n\nWould you want to try again?(y/n):");
answer=getch();
}while(answer=='y');
getch();
return;
}
[解决办法]
希望对你有帮助哈。
[解决办法]
肯定不能互换了,中序是先左再中最后右
pre = p;
这句是设置右子树调用的前驱节点
互换的话肯定就不对了
[解决办法]
左右子树是同等地位,你高兴的话直接把left当右子树;调换位置根本没有任何意义
实现也十分简单;楼上说不能调换的数据结构好好重新看看吧,先序后序中序是针对根节点什么时候遍历到而言的。

热点排行