[数据结构][BST](二叉搜索树)已知前中后序遍历结果,求二叉树问题

BST(二叉搜索树) 已知前中后序遍历结果,求二叉树. 没有找到解题思路,这里整理一份,希望能帮到不清楚的道友

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)))

转载于:https://my.oschina.net/u/1993252/blog/2998529

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值