Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
利用中序遍历和后序遍历构造树,跟前面的博文,利用前序遍历和中序遍历构造树是类似的。
先来构造一颗二叉树。
中序遍历为:9,7,10,4,8,13
后序遍历为:9,10,7,13,8,4
这里是后序遍历划分中序遍历。
差别有2点:
1. 后序遍历的最后一个节点为root
2. root节点4,后面是8,8 是right部分的。所以这里是先构造右子树,再构造左子树。
运行时间:
代码:
ublic class ConstructBinaryTreefromInorderandPostorderTraversal {
private int postIndex = 0;
private Map<Integer, Integer> valueToIndex = new HashMap<>();
public TreeNode buildTree(int[] inorder, int[] postorder) {
for (int i = 0; i < inorder.length; i++) {
valueToIndex.put(inorder[i], i);
}
postIndex = postorder.length - 1;
return doBuildTree(0, inorder.length - 1, postorder);
}
private TreeNode doBuildTree(int inBeigin, int inEnd, int[] postorder) {
if (inBeigin > inEnd) {
return null;
}
int mid = valueToIndex.get(postorder[postIndex]);
TreeNode root = new TreeNode(postorder[postIndex]);
postIndex--;
root.right = doBuildTree(mid + 1, inEnd, postorder);
root.left = doBuildTree(inBeigin, mid - 1, postorder);
return root;
}
}