主题:关于二叉树遍历的思考题
shuangwen163
[专家分:730] 发布于 2007-11-27 16:43:00
如果知道三种遍历中的任两种的表达试
怎么画出它的图?
回复列表 (共17个回复)
11 楼
kangxb [专家分:0] 发布于 2007-12-01 17:00:00
已知,先序遍历和中序遍历,可以求后序遍历;
已知,中序遍历和后序遍历,可以求先序遍历;
但已知,先序遍历和后序遍历,不能求中序遍历;
12 楼
justforfun626 [专家分:18460] 发布于 2007-12-01 23:34:00
[quote]
但已知,先序遍历和后序遍历,不能求中序遍历;[/quote]
WRONG!!!!
13 楼
justforfun626 [专家分:18460] 发布于 2007-12-02 02:02:00
I have put a more readable version of my algorithm here now.
[url]http://bobcat.webappcabaret.net/javachina/faq/algo_01.htm#algo_Q2140[/url]
14 楼
lqwfcje [专家分:660] 发布于 2007-12-02 14:04:00
发一个:
Status(*VisitFunc)(TElemType); /* 函数变量 */
void PreTraverse(SqBiTree T,int e)
{ /* PreOrderTraverse()调用 */
VisitFunc(T[e]);
if(T[2*e+1]!=Nil) /* 左子树不空 */
PreTraverse(T,2*e+1);
if(T[2*e+2]!=Nil) /* 右子树不空 */
PreTraverse(T,2*e+2);
}
Status PreOrderTraverse(SqBiTree T,Status(*Visit)(TElemType))
{ /* 初始条件: 二叉树存在,Visit是对结点操作的应用函数 */
/* 操作结果: 先序遍历T,对每个结点调用函数Visit一次且仅一次。 */
/* 一旦Visit()失败,则操作失败 */
VisitFunc=Visit;
if(!BiTreeEmpty(T)) /* 树不空 */
PreTraverse(T,0);
printf("\n");
return OK;
}
void InTraverse(SqBiTree T,int e)
{ /* InOrderTraverse()调用 */
if(T[2*e+1]!=Nil) /* 左子树不空 */
InTraverse(T,2*e+1);
VisitFunc(T[e]);
if(T[2*e+2]!=Nil) /* 右子树不空 */
InTraverse(T,2*e+2);
}
Status InOrderTraverse(SqBiTree T,Status(*Visit)(TElemType))
{ /* 初始条件: 二叉树存在,Visit是对结点操作的应用函数 */
/* 操作结果: 中序遍历T,对每个结点调用函数Visit一次且仅一次。 */
/* 一旦Visit()失败,则操作失败 */
VisitFunc=Visit;
if(!BiTreeEmpty(T)) /* 树不空 */
InTraverse(T,0);
printf("\n");
return OK;
}
void PostTraverse(SqBiTree T,int e)
{ /* PostOrderTraverse()调用 */
if(T[2*e+1]!=Nil) /* 左子树不空 */
PostTraverse(T,2*e+1);
if(T[2*e+2]!=Nil) /* 右子树不空 */
PostTraverse(T,2*e+2);
VisitFunc(T[e]);
}
Status PostOrderTraverse(SqBiTree T,Status(*Visit)(TElemType))
{ /* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 */
/* 操作结果: 后序遍历T,对每个结点调用函数Visit一次且仅一次。 */
/* 一旦Visit()失败,则操作失败 */
VisitFunc=Visit;
if(!BiTreeEmpty(T)) /* 树不空 */
PostTraverse(T,0);
printf("\n");
return OK;
}
void LevelOrderTraverse(SqBiTree T,Status(*Visit)(TElemType))
{ /* 层序遍历二叉树 */
int i=MAX_TREE_SIZE-1,j;
while(T[i]==Nil)
i--; /* 找到最后一个非空结点的序号 */
for(j=0;j<=i;j++) /* 从根结点起,按层序遍历二叉树 */
if(T[j]!=Nil)
Visit(T[j]); /* 只遍历非空的结点 */
printf("\n");
}
15 楼
shuangwen163 [专家分:730] 发布于 2007-12-04 00:03:00
Thank you very much!!!
it is well worth to post problems on here!
Thank you---jsutforfun262 very much!!!
I especially hope that you are my teacher!!!
16 楼
justforfun626 [专家分:18460] 发布于 2008-01-04 07:12:00
[quote]已知,先序遍历和中序遍历,可以求后序遍历;
已知,中序遍历和后序遍历,可以求先序遍历;
但已知,先序遍历和后序遍历,不能求中序遍历;[/quote]
11 楼 is correct!
I was wrong.
Sorry!!!
17 楼
kangxb [专家分:0] 发布于 2008-02-11 21:44:00
难道不对有呀?请指教。。。
我来回复