大家帮看看!已知某棵二叉树的前序遍历结果为A,B,D,E,G,C,F,H,I,J,其中中序遍历的结果为D,B,G,E,A,H,F,I,J,C。(1)请画出这棵二

jhz2022 2010-01-10 10:32:02
已知某棵二叉树的前序遍历结果为A,B,D,E,G,C,F,H,I,J,其中中序遍历的结果为D,B,G,E,A,H,F,I,J,C。(1)请画出这棵二叉树。(2)给出后序遍历的结果。
...全文
9961 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
kosora曹 2012-09-20
  • 打赏
  • 举报
回复
/*先序序列 的第一个点是树的 根。

在 中序序列 找到这个点,将该点前后的部分分为两段,左边是 左子树 的中序序列,右边是右子树的中序序列。

在 先序序列 里也从左到右分出“相同数目”的两个序列,它们分别是 左右子树 的先序序列。

……
递归思想如上。*/
heelp 2010-02-01
  • 打赏
  • 举报
回复
//编程之美中看过
#include	<stdio.h>
#include <stdlib.h>

typedef struct Node
{
char chValue;
struct Node *lChild;
struct Node *rChild;
}Node;

//重建二叉树
void Rebuild(char *pPreOrder , char *pInOrder , Node **pRoot , int nTreeLen)
{
Node *p;
char *pLeftEnd;
int nLeftLen , nRightLen;

if(!pPreOrder || !pInOrder || !pRoot) //边界条件
{
return;
}

p = (Node *)malloc(sizeof(Node));
p->chValue = *pPreOrder;
p->lChild = p->rChild = NULL;
*pRoot = p;
if(1 == nTreeLen)
{
return;
}

pLeftEnd = pInOrder; //nLeftLen , nRightLen为左右结点数
while(*pLeftEnd != *pPreOrder)
{
pLeftEnd++;
}
nLeftLen = (int)(pLeftEnd - pInOrder);
nRightLen = nTreeLen - nLeftLen - 1;

if(nLeftLen)
{
Rebuild(pPreOrder+1,pInOrder,&((*pRoot)->lChild),nLeftLen);
}
if(nRightLen)
{
Rebuild(pPreOrder+nLeftLen+1,pInOrder+nLeftLen+1,&((*pRoot)->rChild),nRightLen);
}
}


//后序遍历
void PostOrder(Node * T)
{
if(T)
{
PostOrder(T->lChild);
PostOrder(T->rChild);
printf("%c ",T->chValue);
}
}

int main(void)
{
char pPreOrder[] = "HDBACGFE"; //前序序列
char pInOrder[] = "BADCHGEF"; //中序序列
Node *T;

Rebuild(pPreOrder,pInOrder,&T,8);
PostOrder(T);
return 0;
}
Q_Jizi 2010-02-01
  • 打赏
  • 举报
回复
楼主随便找本数据结构看下就会明白了
Caballeroo 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jonsown 的回复:]
              A
            /  \
            B    C
          / \  /
          D  E  F
            /  / \
          G  H  I
                  \
                    J
[/Quote]

就是这个!
qqqljx 2010-01-28
  • 打赏
  • 举报
回复
这个找个例子看看,不难推吧
lnitcscq 2010-01-27
  • 打赏
  • 举报
回复
首先,要画出二叉树。
A必然是 root节点,前序的第一个。

然后看中序:

D,B,G,E,A,H,F,I,J,C。
红色的是树右边的,原因不用多说了吧。

则D为左子的最左,再结合前序里的A,B,D

推出:
A
/
B
/ \
D E
/
G


右边的依次类推。
andensy 2010-01-26
  • 打赏
  • 举报
回复
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 求后序遍历</TITLE>
<script type="text/javascript">
/*
作者:Andensy
功能:求二叉树后序遍历
时间:2010-01-26
*/
var calOrder=function(preOrder,inOrder)
{
if(preOrder==""|preOrder.length==1) return preOrder;
if(inOrder==""|inOrder.length==1) return inOrder;
var index=inOrder.indexOf(preOrder.substring(0,1)); //获得前序第一个节点在中序中的位置
var inlOrder=inOrder.substring(0,index); //中序遍历根的左树
var inrOrder=inOrder.substring(index+1,inOrder.length+1); //中序遍历根的右树

var prelOrder=preOrder.substring(1,index+1); //先序遍历左树
var prerOrder=preOrder.substring(index+1,preOrder.length); //先序遍历右树
document.write(prelOrder+"\t"+inlOrder);
document.write("----------------------");
document.write(prerOrder+"\t"+inrOrder);
document.write("<br>");
return calOrder(prelOrder,inlOrder)+calOrder(prerOrder,inrOrder)+preOrder.substring(0,1);
}
var pre="ABCDEFG";
var ino="CBEDAFG";
var cal=calOrder(pre,ino);
document.write(cal);
</script>
</HEAD>

<BODY>

</BODY>
</HTML>

给一个用js写的实现,直接页面浏览了!^_^
Nelly_me 2010-01-25
  • 打赏
  • 举报
回复
恩,要确定一棵树,中序遍历必须已知!
zqqfly_spider 2010-01-25
  • 打赏
  • 举报
回复
楼上,单知道前序和后序的序列,不能确定一棵二叉树吧~~
zqqfly_spider 2010-01-25
  • 打赏
  • 举报
回复
前:A,B,D,E,G,C,F,H,I,J,
中:D,B,G,E,A,H,F,I,J,C。
前是A 所以,1.根结点是A;2.在中序中,看A的左边的,D,B,G,E,是它的左子树,然后在前序中找子树的根B,又看中序中的B的左边是D,则D为B的左孩子,这样记住前序遍历树是中,左,右。中是左中右,一次类推就可以了,这样的题多做几遍就熟习了~~
Trade_winds 2010-01-25
  • 打赏
  • 举报
回复
我想问一下,给个前序和后序的序列,能求出来这棵二叉树吗?
comiunknown 2010-01-22
  • 打赏
  • 举报
回复
当年大学时《数据结构和算法》这门课,老师留的8道附加题中有一道就是这种题,我当时愣是用非递归法逆推把它搞出来了,后来老师讲解时推荐的标准解法是递归算法。强烈推荐自己啃啃这块硬骨头,很有意思的,当时一周里我满脑子想的都是这题的推理。
dch4890164 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jonsown 的回复:]
A
            /  \
            B    C
          / \  /
          D  E  F
            /  / \
          G  H  I
                  \
                    J
[/Quote]
3楼和6楼是对的,六楼比较好还给出了方法
后续遍历的结果是DGEBHJIFCA
V68V6 2010-01-19
  • 打赏
  • 举报
回复
首先确定根的节点位置

根据先序和中序来锁定

锁定之后,再根据前序和中序的递归定义。利用给定的两个序列元素,采用比较和夹逼的方式把二叉树画出

来。再根据你出来的二叉树按照后序遍历的定义,把第二问做了。关键还是概念。。。
tyzs2001 2010-01-13
  • 打赏
  • 举报
回复
a
b c
d g f
e h i
j
ohyes_cw 2010-01-12
  • 打赏
  • 举报
回复
忘完了
jking1989 2010-01-10
  • 打赏
  • 举报
回复
给你个方法:
已知,前[后]序,和中序遍历,如何简单地求出另一遍历


--------------------------------------------------------------------------------


如题:
已知,前[后]序,和中序遍历,如何简单地求出另一遍历
譬如:
后:FDBGECA
中:BFDAEGC
请列出一些常用的规则,或者其他简单有效的方法。
穷举实在太慢。


--------------------------------------------------------------------------------


举个例子吧

已知前序是ABCDEFG 中序是CBEDAFG 求二叉树
首先从取前序第1个字母(A) 按此字母把中序分成两段 (CBED) (AFG)
A做根 (CBED)做左子树 (FG)右子树
再按长度把前序后面的部分分成(BCDE) (FG)
问题就转换成
已知前序是BCDE 中序是CBED 求二叉树

已经前序是FG 中序是FG 求二叉树
看出来了没有,递归求解的.
下面的步骤省略分析.
前序 中序 : 根 左子树分解 右子树分解
BCDE CBED : B (C) (C) (ED) (DE)
C C : C
DE  ED : D (E) (E)
E E : E
FG FG : F (G) (G)
G G : G
得出的二叉树就是
A
/ \
B F
/ \ \
C D G
/
E
JonSown 2010-01-10
  • 打赏
  • 举报
回复
A
/ \
B C
/ \ /
D E F
/ / \
G H I
\
J
jhz2022 2010-01-10
  • 打赏
  • 举报
回复
大哥 我是新手 麻烦详细点
绿色夹克衫 2010-01-10
  • 打赏
  • 举报
回复
以A为根将中序遍历的结果分为2部分D,B,G,E\H,F,I,J,C,然后再以B为根处理前半段,以此类推!
加载更多回复(2)

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧