Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
首先参考这篇博文:Construct Binary Tree From Inorder and Preorder/Postorder Traversal。
_______7______ / \ __10__ ___2 / \ / 4 3 _8 \ / 1 11
The preorder and inorder traversals for the binary tree above is:
postorder = {4,1,3,10,11,8,2,7} inorder = {4,10,3,1,7,11,8,2}这里可以发现,preorder中每个数的前一个数都是他的右节点,令他在inorder里的位置是,那么 他的左节点是postend - (inend - instart) - 1,其实就是减去右子树总节点的个数再减1。根据这个思路写代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return helper(postorder.length - 1, 0, inorder.length - 1, inorder, postorder);
}
private TreeNode helper (int postend, int instart, int inend, int[] inorder, int[] postorder) {
if (postend < 0 || instart > inend) {
return null;
}
TreeNode root = new TreeNode(postorder[postend]);
int index = 0;
for (int i = 0; i < inorder.length; i ++) {
if (inorder[i] == root.val) {
index = i;
break;
}
}
root.left = helper(postend - (inend - index) - 1, instart, index - 1, inorder, postorder);
root.right = helper(postend - 1, index + 1, inend, inorder, postorder);
return root;
}
}