中序:3 4 8 6 7 5 2 1 10 9 11 15 13 14 12
后序:8 7 6 5 4 3 2 10 15 14 13 12 11 9 1
恢复用到的结论
后序最后一个访问的就是根结点,所以根结点就是1
中序遍历特点是根节点的左子树的元素都在根节点的左侧,右子树的元素都在根节点的右侧,从中序遍历序列可以划分如下结构
第一轮:
中序和后序划分
中序序列划分:
[3 4 8 6 7 5 2 ] 1 [ 10 9 11 15 13 14 12]
后序序列划分:
[8 7 6 5 4 3 2 ] [ 10 15 14 13 12 11 9 ] 1
后序序列第一个括号里的都是左子树的元素,第二个括号都是右子树的元素
括号分开的方式
参照中序的两个数组划分的,后序中8之前的元素都在中序第一个数组中,9之后的所有元素都在第二个数组中,所以从8和9之间划分
树的结构图
第二轮:
先看两个序列的第一个数组:
中序: 3 4 8 6 7 5 2 后序:8 7 6 5 4 3 2
利用上面结论再次划分:后序最后一位是根节点为2,然后根据2在中序中的位置可以划分为:
中序:[ 3 4 8 6 7 5 ] 2
后序:[8 7 6 5 4 3 ] 2
树的结构图:
第三轮:
对3 4 8 6 7 5 继续划分:
中序:3 [ 4 8 6 7 5 ]
后序:[8 7 6 5 4 ] 3
树的结构图:
同理,即可完成恢复整棵树的操作,把null去掉
最后的图的实现
最后去掉所有的空结点即可