对二叉树遍历操作的深入思考
对二叉树遍历操作的深入思考
已知某棵二叉树,容易求得它的某种遍历序列,但是,反过来,若已知某种遍历序列,是否可以唯一确定一棵二叉树呢?
1、若已知先/中/后序序列......
例:已知先序列为0-1-2-3-4-5-6-7-8
对应情况:
可以看到,两幅图片虽然先序是一样的,但两棵树完全是不同的两棵树。
2、若已知中序和后序序列......
例:
已知中序遍历:B D C E A F H G
已知后序遍历:D E C B H G F A
结果:
推断过程:
- (1)从后序遍历表中以及后序的性质,可以判定A是根
-
(2)从中序遍历表中以及中序的性质,加以条件(1)以知道BDCE是A的左子数,FHG是A的右子树
-
(3)先看FGH,在后序遍历中可以看到顺序是HGF可以说明F是A的右结点;看中序遍历可以看到顺序是FHG,如果F有左子结点的话,根据中序遍历的性质,中序遍历表中A的后面绝逼不是F,但结果是F,说明F没有左结点;要实现在中序遍历中,F后面的结点排布是H G的话,就要使H是G的左节点,综上所述,这一步可以得到这么个结果:
- (4)再看BDCE,从中序遍历可以看到顺序为:BDCE,若B有左子结点,则第一个不会是B,说明B并没有左子结点;从后序遍历中可以看到,顺序为:DECB,说明B是A的左子结点;剩下DCE,根据中序遍历,我有两种猜想
但是根据后序遍历所示,顺序为:DEC,对于第一种猜想,应该E是D的根,与猜想1的情况出入,因此猜想2为正确的,综上所述,可以得到这么个结果:
因此可以得到一条定律:后序定根,中序分左右。
3、若已知中序和先序序列......
例:
已知中序遍历:G D H B A E C I F
已知先序遍历:A B D G H C E F I
结果:
推断过程:
类似上面的运用两种遍历方法的性质和遍历表的排布,我就懒得写了,推一推就出来了...
4、若已知先序和后序序列......
例:
二叉树前序遍历为ABDEGCFH,后序序列为DGEBHFCA
可以确定第一个根节点是A,A第一个子树根节点是B,根节点为B的子树后序遍历为DGEB,前序遍历为BDEG,A第二个子树根节点为C,他的后序遍历为HFC,前序遍历为CFH,然后一次递归。简单起见,我们只看A第二个子树,即右子树C。C的第一个根节点F,子树F的后序遍历HF,前序遍历FH,C没有第二个子树,这时不管F为左子树还是右子树都是满足要求的。同理F的子树H。
图中只有一个子树的用两条线连接,表示这是左右子树均可。
最后结论:中序+先序,或中序+后序均能唯一确定一棵二叉树,但先序+后序却不一定能唯一确定一棵二叉树。