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

思路:

  1. 通过前序遍历算法和后序遍历算法知道“中”是谁,
  2. 找到中序遍历数据的“中”,分割成“左”“右”2部分
  3. 对“左”“右”单独执行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)))

01-08 05:01