当前位置: 代码迷 >> C语言 >> 请教各位老师一个问题:有关先序、中序确定二叉树的算法
  详细解决方案

请教各位老师一个问题:有关先序、中序确定二叉树的算法

热度:198   发布时间:2007-08-26 11:41:48.0
请教各位老师一个问题:有关先序、中序确定二叉树的算法

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

在网上一个论坛搜到的,原出处: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编辑过]

搜索更多相关的解决方案: 二叉树  算法  老师  

----------------解决方案--------------------------------------------------------
哪里来的老师
----------------解决方案--------------------------------------------------------
中序遍历是LTR(L是左子树 T是根 R右子树)
从左孩子到根到右孩子
比如:
1
2 3
4 5
他的中序遍历为4 2 5 1 3
记住上面的规则
整棵二叉树从左――》右的遍历
左边的从子树开始
右边的类推……

----------------解决方案--------------------------------------------------------
以下是引用栖柏在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编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案