利用一棵二叉树的中序遍历的结果数组和后续遍历的结果数组复原该树:
采用分治策略,解析如下图:
如图:中序遍历数组的division特征为左(0 --> x) 根(x + 1) 右(x + 2 --> length - 1)
后序遍历数组的division特征为左(0 --> x) 根(x + 1 --> length - 2) 右(length - 1)
我们可以将中序和后序的数组的左部分和右部分作为根节点的左子树和右子树进行递归处理
那么如何在这两个数组中找到划分division的x呢?
首先这里我们用到哈希表,只需在开始对inorder的元素进行element对index的初始化映射即可
因为我们知道root就是postorder[postorder.length - 1], 既可以以O(1)时间迅速定位到其在inorder中的index,则x可得
另外类似的一题为 “利用先序和中序遍历的数组构造二叉树” 和此题原理相同
Java Code:
public class Solution { Map<Integer, Integer> inMap; int[] inorder; int[] postorder; public TreeNode buildTree(int[] inorder, int[] postorder) { this.inorder = inorder; this.postorder = postorder; inMap = new HashMap<Integer, Integer>(); for(int j = 0;j < inorder.length;j++) { inMap.put(inorder[j],j); } int in_start = 0; int in_end = inorder.length - 1; int po_start = 0; int po_end = postorder.length - 1; return build(in_start, in_end, po_start, po_end); } public TreeNode build(int in_start,int in_end, int po_start, int po_end) { if(in_end < in_start||po_end < po_start) return null; TreeNode root = new TreeNode(postorder[po_end]); int index_root_inorder = inMap.get(root.val); root.left = build(in_start, index_root_inorder - 1, po_start, po_start + index_root_inorder - 1 - in_start ); root.right = build(index_root_inorder + 1, in_end, po_start + index_root_inorder - in_start, po_end - 1); return root; } }
时间: 2024-11-08 17:47:40