中序与后序遍历序列构造二叉树
问题描述:
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
解题思路:
中序遍历,先遍历左子树,然后遍历根结点,最后遍历右子树。
因此中序遍历序列被根节点分为两部分:根结点之前的部分为左子树结点中序序列,根结点之后的为右子树结点中序序列。
后序遍历,最后遍历根节点,故后序序列的最后一个元素为根节点。
由根节点在中序序列中的位置,可得到左子树与右子树的中序序列,也可得到左子树与右子树的后续序列。
实现代码:
private static Map<Integer, Integer> map; private static TreeNode build(int[] postorder, int p, int q, int[] inorder, int i, int j) { if (p > q) return null; if (p == q) return new TreeNode(postorder[q]); TreeNode node = new TreeNode(postorder[q]); int k = map.get(postorder[q]); node.left = build(postorder, p, p+k-i-1, inorder, i, k-1); node.right = build(postorder, p+k-i, q-1, inorder, k+1, j); return node; } public static TreeNode buildTree(int[] inorder, int[] postorder) { map = new HashMap<Integer, Integer>(inorder.length); for (int i=0; i<inorder.length; i++) map.put(inorder[i], i); return build(postorder, 0, postorder.length-1, inorder, 0, inorder.length-1); }
posted on 2018-07-12 19:40 Deltadeblog 阅读(656) 评论(0) 编辑 收藏 举报