| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 550 人关注过本帖
标题:请教各位老师一个问题:有关先序、中序确定二叉树的算法
只看楼主 加入收藏
cillin
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2005-3-10
收藏
 问题点数:0 回复次数:3 
请教各位老师一个问题:有关先序、中序确定二叉树的算法

问题已解决,自己犯了个傻呵呵:)谢谢回帖的前辈们。

在网上一个论坛搜到的,原出处:http://60.28.222.210/dispbbs.asp?BoardID=60&id=25234&replyID=25234&star=1&skin=0

我感觉这个算法在建立右子树根的判断上是有点问题的:当前已建立的根结点(visited[p])在中序序列中的后继元素(visited[p+1])就是该根结点的右子树根吗?中序序列中的某点的的后继元素应该是该结点的右子树的最左孩子才对啊?
刚学数据结构不久,请各位前辈指教。愚钝之处还请包涵,谢谢。

#define FALSE 0
#define TRUE 1
typedef int Status;

Status createTree(BiTree &T, BiTNode pre[], BiTNode order[]){
// 已知先序序列pre和中序序列order,构建一个二叉树T的非递归实现。
// 其中涉及到的数据结构请参看清华大学《数据结构》(C语言版)

InitStack(Stack); //初始化栈
for (i = 0; i < order.length; i ++) visited[ i ] = FALSE;
// 初始化visited,visited用于标记order
// 中的元素是否已经被访问过
T = (BiTree *) malloc (sizeof(BiTree));
T.data = pre[0]; T -> lchild = NULL; T -> rchild = NULL;
// 生成根节点,先序pre中的第一个元素肯定是树根,
// 左右孩子初始化为NULL。
p = LocateElem(order, pre[0].data); // 在order中找到根节点所在的位置
visited[ p ] = TRUE; // 标识order中的根元素已被访问过
cur = T; // cur表示当前构建的节点

for (i = 1; i < pre.length; ) {

if (p > 0 && !visited[p - 1]) {
// 在order中pre[ i ]的左边有元素并且未被访问过,说明有左子树存在,
// 生成左子树
cur->lchild = (BiTNode *) malloc (sizeof(BiTNode));
cur->lchild.data = pre[ i ];
// 将当前pre中的元素赋给lchild后指向下一个元素
cur->lchild->lchild = NULL; cur->rchild->rchild= NULL;
p = LocateElem(order, pre[ i ++].data); // 定位pre[ i ]的位置
visited[ p ] = TRUE;
Push(Stack, cur); // 当前节点进栈
cur = cur->lchild; // 当前节点指向左孩子
}
else if (p < order.length && !visited[p + 1]) {
// 生成右子树
cur->lchild = NULL; // 没有左孩子
cur->rchild = (BiTNode *) malloc (sizeof(BiTNode));
cur->rchild.data = pre[ i ];
cur->rchild.lchild = NULL; cur->rchlid.rchild = NULL;
p = LocateElem(order, pre[ i ++].data); // 定位pre[ i ]的位置
visited[ p ] = TRUE;
cur = cur->rchild;
}
else {
Pop(Stack, cur); // 左右都没有子树即是叶子,则退栈
p = LocateElem(order, cur.data); // 重新定位p的位置
}
}
}

[此贴子已经被作者于2007-8-26 17:05:30编辑过]

搜索更多相关主题的帖子: 二叉树 算法 老师 
2007-08-26 11:41
无理取闹
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:53
帖 子:4264
专家分:0
注 册:2006-7-26
收藏
得分:0 
哪里来的老师

win32汇编
病毒 加密
目前兴趣所在
2007-08-26 11:44
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
收藏
得分:0 
中序遍历是LTR(L是左子树 T是根 R右子树)
从左孩子到根到右孩子
比如:
1
2 3
4 5
他的中序遍历为4 2 5 1 3
记住上面的规则
整棵二叉树从左——》右的遍历
左边的从子树开始
右边的类推……

You have lots more to work on! Never give up!c language!
2007-08-26 12:16
cillin
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2005-3-10
收藏
得分:0 
以下是引用栖柏在2007-8-26 12:16:20的发言:
中序遍历是LTR(L是左子树 T是根 R右子树)
从左孩子到根到右孩子
比如:
1
2 3
4 5
他的中序遍历为4 2 5 1 3
记住上面的规则
整棵二叉树从左——》右的遍历
左边的从子树开始
右边的类推……


已OK谢谢您。发帖太草率了。今后再提问一定三思而后行。

[此贴子已经被作者于2007-8-26 17:04:29编辑过]


2007-08-26 13:34
快速回复:请教各位老师一个问题:有关先序、中序确定二叉树的算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030647 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved