用数学归纳法证明二叉树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树

news/2024/11/23 5:29:01/

用数学归纳法证明二叉树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树。
首先说明:思想来自文都考研洪老师。包括逻辑框架的搭建,此篇文章为框架搭建完成后将细节补充完整。

思想来自文都考研洪老师

首先,用到的数学的证明思想是第二类数学归纳法(完整归纳法),
其思想如下:
(1)第二类数学归纳法(完整归纳法)
1.当n=1时,形式成立(数学形式)。
2.当n<=k时,假设形式成立。
3.当n=k+1时,形式成立。
那么可以得出结论,这个数学形式可以在n等于任意自然数时,都可以使得形式成立。

给定一颗二叉树(树非空,结点个数为n)
1.当n=1时, 树的先序遍历序列为(a)
树的中序遍历序列为(a)
那么可以唯一确定一颗二叉树 a
2.假设n<=k时,
一颗树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树。
3.当n=k+1时
先序遍历序列(A1,A2,A3,A4,…,Am)
中序遍历序列(B1,B2,B3,B4,…,Bm)

a.当A1=B1时,即先序遍历的第一个遍历结点(为树的根结点)等于中序遍历的第一个结点的时候,说明中序遍历B1(B1为根结点)之前无左子树,(中序遍历若要先遍历根结点要先中序遍历左子树,若B1之前为空,说明没有中序遍历左子树,说明B1的左子树为空)
{
因为中序遍历的递归定义是
1.中序遍历左子树,
2.遍历根节点,
3.中序遍历右子树。
}
故而又说明中序遍历序列B1之后的结点即(B2,B3,B4,…,Bm)为B1的右子树
又因为m=n=k+1
所以(B2,B3,B4,…,Bm)共有m-2+1=m-1=k+1-1=k个结点。
而先序遍历序列A1之后的序列(A2,A3,A4,…,Am)
也有m-1=k+1-1=k个结点。
这时候符合假设,当n<=k时,的结论,所以根据数学归纳法,可以证明在这种情况下,一棵树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树。

b.
先序遍历序列(A1,A2,A3,A4,…,Am)
中序遍历序列(B1,B2,B3,B4,…,Bm)
当A1=Bm时,Bm无右子树,同3.a的证明思路一样,可以证明在这种情况下,一棵树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树。
c.(已经证明了A1=B1或者A1=Bm的情况,现在要证明的是A1=(B2,B3,B4,…,Bm-1)中任意一个的情况时,一棵树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树)
先序遍历序列(A1,A2,A3,A4,…,Am)
中序遍历序列(B1,B2,B3,B4,…,Bm)
当先序遍历序列(A1,A2,A3,A4,…,Am)中的A1为中序序列中的
(B2,B3,B4,…,Bm-1)时

设A1=Bj,那么这棵树的中序遍历序列为
{(B1,B2,B3,…,Bj-1)Bj (Bj+1,Bj+2,Bj+3,…,Bm )}
而因为(B1,B2,B3,B4,…,Bm)为中序遍历序列所以
Bj的左子树为(B1,B2,B3,…,Bj-1)
Bj的右子树为(Bj+1,Bj+2,Bj+3,…,Bm )
设Bj的左子树的结点个数为x个,Bj的右子树的结点个数为y个,
那么可以明确的是,
1<=x<=m-1-1(由c的条件可得,Bj不能为Bm,由c的条件可得,所以Bj的右子树最小为1个结点,而Bj本身又是一个结点,所以Bj左子树结点的个数最大为m-1-1,即总的减去Bj再减去Bj右子树最小的时候,就是Bj左子树最大的时候)
而确定y也是同理,只不过成立确定Bj右子树的结点个数的范围。
1<=y<=m-1-1
而且,x+y=m-1
(Bj的左右子树的总个数即为总的个数减去Bj本身)。

而这个时候,
Bj的左子树为(B1,B2,B3,…,Bj-1)
节点个数1<=x<=m-1-1=k-1 (m=n=k+1)
Bj的右子树为(Bj+1,Bj+2,Bj+3,…,Bm )
结点个数1<=y<=m-1-1=k-1 (m=n=k+1)
由于A1=Bj 先序遍历序列(A1,A2,A3,A4,…,Am)

又因为先序遍历的递归定义为{
遍历根节点,
先序遍历根节点的左子树,
先序遍历根节点的右子树。
}
所以先序遍历序列为(A1,A2,A3,A4,…,Am)
逻辑上为
(A1,(A1的左子树的先序遍历),(A1的右子树的先序遍历))。

又因为中序遍历的递归定义是
1.中序遍历左子树,
2.遍历根节点,
3.中序遍历右子树。

而此树的中序遍历序列为(B1,B2,B3,B4,…,Bm)
所以中序遍历序列的逻辑上为
((Bj左子树的中序遍历序列),Bj,(Bj的右子树的中序遍历序列))

从而可以得到,
(A1,(A1的左子树的先序遍历),(A1的右子树的先序遍历))
((Bj左子树的中序遍历序列),Bj,(Bj的右子树的中序遍历序列))

从而又得到
(A1的左子树的先序遍历序列)
(Bj的左子树的中序遍历序列)

(A1的右子树的先序遍历序列)
(Bj的右子树的中序遍历序列)

而且A1=Bj(此表达式说明A1、Bj标识的是树中的同一个结点)
所以得到的是同一个节点的
(Bj(或A1)的左子树的先序遍历序列)|Bj(或A1)的左子树结点
(Bj(或A1)的左子树的中序遍历序列)|个数1<=x<=m-1-1=k-1

(Bj(或A1)的右子树的先序遍历序列)|Bj(或A1)的右子树结点
(Bj(或A1)的右子树的中序遍历序列)|个数为1<=y<=m-1-1=k-1

所以,就将规模为n=m=k+1的问题化为了两个问题规模为
1<=n<=m-1-1=k-1的问题
又因为假设n<=k时,数学结论成立,
所以问题规模为k+1的问题化为了
两个问题规模为1<=n<=m-1-1=k-1的时候
{((唯一左子树),根,(唯一右子树))=唯一二叉树},
问题规模为k+1的数学结论也成立 。
从而推出n=k+1时数学结论成立。

根据第二类数学归纳法(完整归纳法)
1.因为n=1时数学结论成立,

2.而且n<=k时,假设数学结论是成立的,

3.还有可以将问题规模为k+1的问题化为两个问题规模为1<=n<=k-1的子问题,(因为假设n<=k时数学结论成立)从而推出n=k+1时数学结论成立{((唯一左子树),根,(唯一右子树))=唯一二叉树},

从而可以推出,当n为任何自然数时,数学结论都成立,所以,当n取任意自然数时,结点个数为n先序遍历序列和中序遍历序列可以唯一确定一个结点个数为n的二叉树

证毕。(同样的思路可以证明结点个数为n的后序遍历序列和结点个数为n中序遍历序列可以唯一确定一颗结点个数为n二叉树)

注: 1。数学归纳法只是验证经验模型或者经验式子是否足以成为规律,它并不是演绎推理得出数学规律的手段,而是验证手段
2。当n=k+1时不能直接代入n<=k的式子,而是要从n<=k的式子推出n=k+1的式子的形式与n<k+1的一样,这样才是数学归纳
3。证明的突破口在先序遍历二叉树和中序遍历二叉树的定义
注意 根节点是同一个根节点,因为同一颗二叉树只有一个根节点
根的左子树也是相同的,根的右子树也是相同的
{根节点 先序遍历左子树 先序遍历右子树}
{中序遍历右子树 根节点 中序遍历右子树}


http://www.ppmy.cn/news/695113.html

相关文章

gps有几个轨道面_GPS(全球定位系统)的 24 颗卫星的轨道是如何设计的?

谢邀,先稍微补充下背景知识, 任何一颗卫星在设计时,都要考虑六个参数,叫做轨道六根数 两个决定了卫星轨道的形状:1)轨道半长轴,决定了轨道大概多大,或者距离地球有多高;2)偏心率决定了大概多扁,偏心率为0就是圆了 四个决定了卫星轨道的位置:3)轨道倾角,决定了轨道与…

前序遍历和中序遍历唯一确定一颗二叉树

---恢复内容开始--- 问题描述 如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一颗二叉树。 基本要求 已知一棵二叉树的前序序列和中序序列,试设计完成下列任务的一个算法: (1).构造一颗二叉树 (2).证明构造正确(即分拨儿以前序和中序遍历该树,将得到的…

删除一颗二叉树

package tree;public class DeleteBT {/*** 删除一颗二叉树* param args*/public static TreeNode delete(TreeNode root){if(rootnull) return root;root.left delete(root.left);root.right delete(root.right);return null;}public static void main(String[] args) {Tree…

题目: 打印输出上下左右对称的,第一行一颗星,第二行三颗星,第三行五颗星,第四行七颗星,第五行五颗星,第六行三颗星,第七行一颗星

题目: 打印输出 * *** ***** ******* ***** *** * /* 分析: 前4行,行数1 2 3 4 i空格数3 2 1 0 4-i星数1 3 5 7 2*i-1 后3行,行数1 2 3 i空格数1 2 3 i星数5 3 1 7-2*i*/ class Test14 {public static void main(String[] a…

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖

小明开了一家糖果店。他别出心裁&#xff1a;把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候&#xff0c;他就用这两种包装来组合。当然有些糖果数目是无法组合出来的&#xff0c;比如要买 10 颗糖。 你可以用计算机测试一下&#xff0c;在这种包装…

Python---堆里有16颗豆子,有两个玩家依次取豆

题目&#xff1a; 堆里有 16 颗豆子&#xff0c;有两个玩家&#xff08;假设一个玩家是电脑&#xff09; 。每个玩家都可以从堆中的 16 颗豆子中取出 1 颗&#xff0c;2 颗或者 3 颗豆子。每个玩家在每回合中必须从堆中取出一定数目的豆子。玩家轮流取出豆子&#xff0c;取到最…

给定任何两种遍历序列能否确定唯一一颗二叉树

给定任何两种遍历序列能否确定唯一一颗二叉树 我们知道确定一颗二叉树&#xff0c;必须要确定它的中序遍历&#xff0c;再加上层次遍历&#xff0c;后序遍历&#xff0c;前序遍历三个中间的一种。为什么这样说呢接下来可以验证一下&#xff0c;这里强烈推荐一下生成二叉树的网…

复制一颗二叉树(java语言)

复制一颗二叉树&#xff08;java语言) 在一棵二叉链表表示的二叉树中&#xff0c;复制一颗二叉树&#xff08;利用java编程语言&#xff09; 我的求解方法&#xff1a;首先创建一个泛型的数组&#xff0c;目的是为了存放二叉树&#xff08;新复制&#xff09;的标明空子树的先…