对二叉树遍历操作的深入思考
2017-10-21 08:18
169 查看
对二叉树遍历操作的深入思考
已知某棵二叉树,容易求得它的某种遍历序列,但是,反过来,若已知某种遍历序列,是否可以唯一确定一棵二叉树呢?
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。
图中只有一个子树的用两条线连接,表示这是左右子树均可。
最后结论:中序+先序,或中序+后序均能唯一确定一棵二叉树,但先序+后序却不一定能唯一确定一棵二叉树。
相关文章推荐
- web2py 操作cookie 深入思考
- 思考的乐趣:UyHiP趣题之用最少的块移动实现逆序操作
- js操作cookies从原理..到深入..
- 异步操作之深入了解
- 【MongoDB学习笔记12】深入MongoDB的更新(update)操作:数组修改
- 深入理解Oracle的并行操作
- 显意识和潜意识话题引发的深入思考
- 深入学习jQuery特性操作
- 深入PHP操作MongoDB的技术总结
- 深入理解C++构造、析构、赋值操作
- IO操作课程总结及思考
- 深入探索C++对象模型笔记之三 —— 构造函数语意学 (Default Constructor的建构操作)
- 深入理解C++中的文件操作
- 从错误信息思考一个问题:.NET Framework 与 COM/COM+ 到底有多深入的关联呢?
- 多线程环境下对变量的读写操作的原子性问题(一道百度笔试题引发的思考)
- mysql数据库设计范式与反设计范式操作思考
- docker深入2-容器删除操作失败
- undo系列学习之深入剖析一个事务的操作流程
- 数字图像处理作业之MATLAB操作现象思考
- 深入云存储系统Swift核心组件:Ring数据结构及构建、重平衡操作