BST(二叉搜索树)已知前中后序遍历结果,求二叉树
- 前序遍历:4,3,1,2,8,7,16,10,9,14
- 中序遍历:1,2,3,4,7,8,9,10,14,16
- 后序遍历:2,1,3,7,9,14,10,16,8,4
思路:
- 通过前序遍历算法和后序遍历算法知道“中”是谁,
- 找到中序遍历数据的“中”,分割成“左”“右”2部分
- 对“左”“右”单独执行1、2步骤,知道不可分割。
求解:已知
- 前序遍历算法是“中左右”, “中”在第一个
- 中序遍历算法是“左中右”, “中”在中间
- 后序遍历算法是“左右中”, “中”在最后一个
注:用符号括号代表一个树(left,node,right), 用符号[]代码没有排序好的树
step1 找到“中”
- 前序遍历:(4),3,1,2,8,7,16,10,9,14
- 中序遍历:1,2,3,(4),7,8,9,10,14,16
- 后序遍历:2,1,3,7,9,14,10,16,8,(4)
step2 将“中”放入中序遍历,将数据分割成“左右”2部分
- 前序遍历:(4),[3,1,2],[8,7,16,10,9,14]
- 中序遍历:[1,2,3],(4),[7,8,9,10,14,16]
- 后序遍历:[2,1,3],[7,9,14,10,16,8],(4)
树结构为: ([3,1,2] , 4 , [8,7,16,10,9,14])
step3 将step2中的“左”取出
- 前序遍历:3,1,2
- 中序遍历:1,2,3
- 后序遍历:2,1,3
step4 再次执行1,2步骤
找到“中”=3,则“左”=[1,2] "右"=空
- 前序遍历:(3),1,2
- 中序遍历:1,2,(3)
- 后序遍历:2,1,(3)
所以 [3,1,2] = ([1,2], 3, empty)
取出 "左"的三组数列
- 前序遍历:1,2
- 中序遍历:1,2
- 后序遍历:2,1
“中”=1, 则“左”=[] "右"=[2]所以:([1,2], 3, empty) = ((empty,1,2),3,empty)
step5 取出“右”=[8,7,16,10,9,14],再次执行1,2步骤
- 前序遍历:8,7,16,10,9,14
- 中序遍历:7,8,9,10,14,16
- 后序遍历:7,9,14,10,16,8
树 (7,8,[9,10,14,16])
- 前序遍历:16,10,9,14
- 中序遍历:9,10,14,16
- 后序遍历:9,14,10,16
树 ((empty,7,empty),8,([9,10,14],16,empty))
- 前序遍历:10,9,14
- 中序遍历:9,10,14
- 后序遍历:9,14,10
树 ((empty,7,empty),8,((9,10,14),16,empty))
step6 合并
(((empty,1,2),3,empty),4,((empty,7,empty),8,((9,10,14),16,empty)))