二叉树的证明问题!

frankzch 2003-09-29 02:05:23
证明:先序遍历和后序遍历不可以确定一个二叉数
: 而先序遍历和中序遍历可以确定一个二叉数

...全文
91 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZhangYv 2003-09-29
  • 打赏
  • 举报
回复
还有3个还没和我联系...
第1题,在递归时候只剩一个节点,无法判定该节点是其父节点的左或右儿子,不能唯一确定
第2题,用反证法容易得解。
短歌如风 2003-09-29
  • 打赏
  • 举报
回复
联系过了,昨天我每人发了两封E-mail,通知他们今天来看题目,有两人回了信,一人因邮箱已满把我的信退回来了,我已经在CSDN上给他发了消息。
短歌如风 2003-09-29
  • 打赏
  • 举报
回复
呵呵……
使用实现方法来证明“可以实现”并不是我的发明,在证明“GOTO语句可由三大流程控制结构代替”时就用了一个算法实现了把任意流程图改为用三大流程控制结构的,虽然其结果导致可读性更差,但的确证明了GOTO语句在“对各种流程控制的实现”上并没有必然存在的理由。
frankzch 2003-09-29
  • 打赏
  • 举报
回复
OK,反例证明

另:短歌 你跟你的组员联系上了吗?
短歌如风 2003-09-29
  • 打赏
  • 举报
回复
事实上,只要在二叉树中有只有一个子树的节点,则些二叉树必然无法用它的先序和后序两个序列唯一再现。而如果不存在这样的节点,可以用下面的方法再现:


设X的先序序列为A = (a0, a1, a2……an),后序序列为B=(b0, b1, b2……bn)。
则必然a0 = bn = D(X)

0:如n = 0,则X=nil
1: 取a0为新树的根,生成新序列A'(a1,a2,……an)和B'(b0,b1,b2……b(n-1))
2:如新序列为空,则X无子树;否则,据先序遍历定义,a1必为X的左子树的根(左子树必然存在)。在B'中找到bi=a1,则BL=(b0,b1,b2……bi)为LRD(L(X)),BR=(b(i+1)……b(n-1))为LRD(R(X))。在A'中取相同元素个数的子序列得AL=DLR(L(X))和AR=DLR(R(X))。
3:用AL和BL恢复左子树,用AR和BR恢复右子树。
短歌如风 2003-09-29
  • 打赏
  • 举报
回复
第一个问题是不是可以这样证明:

当两A、B二叉树根相同,L(A)=R(B),R(A)=nil,L(B)=nil时:
A的先序遍历序列为:
DLR(A) = D(A), DLR(L(A)),DLR(R(A))
= D(A), DLR(L(A))
B的先序遍历序列为:
DLR(B) = D(B), DLR(L(B)), DLR(R(B))
= D(B), DLR(R(B))
而D(A) = D(B), L(A) = R(B),因此可证DLR(A)=DLR(B)
同理可证LRD(A) = LRD(B),而A <> B
从而无法从这两个序列中确定一棵二叉树。

上面的函数:
D(X)为X的根节点
L(X)为X的左子树
R(X)为X的右子树
DLR(X)为X的先序遍历序列
LRD(X)为X的后序遍历序列
短歌如风 2003-09-29
  • 打赏
  • 举报
回复
第一个问题是不是可以这样证明:

当两A、B二叉树根相同,L(A)=R(B),R(A)=nil,L(B)=nil时:
A的先序遍历序列为:
DLR(A) = D(A), DLR(L(A)),DLR(R(A))
= D(A), DLR(L(A))
B的先序遍历序列为:
DLR(B) = D(B), DLR(L(B)), DLR(R(B))
= D(B), DLR(R(B))
而D(A) = D(B), L(A) = R(B),因此可证DLR(A)=DLR(B)
同理可证LRD(A) = LRD(B),而A <> B
从而无法从这两个序列中确定一棵二叉树。

上面的函数:
D(X)为X的根节点
L(X)为X的左子树
R(X)为X的右子树
DLR(X)为X的先序遍历序列
LRD(X)为X的后序遍历序列
frankzch 2003-09-29
  • 打赏
  • 举报
回复
原来把前序和中序序列转化为树的过程也可以作为证明

那第一问就可以举一个反例来证明就好了
短歌如风 2003-09-29
  • 打赏
  • 举报
回复
先证明后半部分:

设一二叉树的先序遍历和中所序遍历序列分别是A=(a0,a1,a2……an)和B=(b0,b1,b2……bn)

0: 如n=0则二叉树为空。
1:取A中第一个a0,据先序遍历定义可知a0为根。
2:找到B中与a0相等的bi;据中序遍历定义可知,BL = (b0,b1……b(i-1))为左子树中序遍历序列,BN = (b(i+1)……bn)为右子树中序遍历序列。
3:从A中去除a0得A'=(a1,a2……an),据先序遍历定义可知,其中前m个元素为左子树先序遍历序列,其余为右子树先序遍历序列,其中m为左子树节点数。
4:据BL可得左子树节点数m,取A'前m个元素组成新的序列AL,A'中剩余元素组成新的序列AR。
5:用些方法从(AL,BL)中恢复左子树,从(AR,BR)中恢复右子树。

以上方法可以用先序遍历和中序遍历两个序列恢复二叉树,因此先序遍历和中序遍历可以确定一个二叉数。
frankzch 2003-09-29
  • 打赏
  • 举报
回复
I am not good at demonstration,who can help me?
thank you very very very very very much ,and enjoy yourself in the festival!

33,006

社区成员

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

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