本题需要根据二叉树的前序遍历和中序遍历还原原树,然后按规则简化树,最后输出后序遍历。
核心算法包括:二叉树重建、深度优先搜索、路径和剪枝、链式节点合并。
具体做法:
先用前序遍历和中序遍历重建二叉树。前序遍历的第1个值一定是当前子树根节点,在中序遍历中找到根节点位置后,可以确定左子树和右子树范围。
在容器镜像管理系统中,容器镜像通常采用堆叠方式管理和挂载。为了减少镜像管理系统中重复的镜像层数量,假定容器镜像采用二叉树管理。镜像层二叉树节点描述镜像层大小,节点的镜像完整大小为镜像层大小及其所有父镜像层大小之和。当前需要对镜像管理系统中的镜像二叉树进行整理,整理过程必须满足如下规则:
输入为容器镜像二叉树前序遍历数组和中序遍历数组,输出为镜像树简化后的后序遍历数组。
容器镜像树前序遍历、中序遍历结果中的数字表示当前镜像层大小,取值范围为 [−10000,10000]。
镜像层大小为负数时表示该层基于父镜像删除文件,镜像层为正数时表示该层基于父镜像新增文件,0 则表示镜像层未做任何更改或者裁剪文件大小与新增文件大小相等;
节点规模数量 ≤1000。
为了能够通过前序遍历和中序遍历还原唯一的镜像二叉树,输入的各节点镜像层大小都不相同。
镜像树精简后,采用后序遍历输出。
说明:如果输出的二叉树为空,则输出字符串 null。
输入
1 2 3 4 5 6
2 1 3 5 4 6
输出
2 5 6 7 1
说明

如图所示,左图为输入的二叉树,由于 3 节点只有一个子节点,因此 3 节点可以合并到 4 节点,合并大小之后为 7 ,因此最终得到右图二叉树,后序遍历输出为 2 5 6 7 1 。
输入
1 2 3 -5 5 6
2 1 3 5 -5 6
输出
2 3 1
说明

如图所示,左图为输入的二叉树,由于 −5 节点计算出镜像完整大小为 −1 ,小于等于 0 ,因此属于非法节点,需要剪枝处理,剪枝后得到最右边的二叉树,后序遍历输出为 2 3 1 。
输入
1 2 4 3 -9 6
2 1 4 3 -9 6
输出
2 7 1
说明

如图所示,图 1 为原始镜像树,图 2 显示经过计算后 −9 节点的完整大小为 −1 ,需要优先按照规则一剪枝得到图 3 ,图 3 的节点 4 只有一个子节点,需要按规则二进行合并,得到图 4 镜像树。