这题是套路,看过一遍就应该很容易理解记忆了。后面的题是变体,通过inorder + postorder 来构建一棵树。所以inorder是必须的,然后preorder 和 postorder 有一个就okay了。
关键一点是找到inorder中root的位置,可以根据root.value来找。然后为了查询 inorder中的root index 简单容易,通过构建一个HashMap就可以。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
HashMap<Integer, Integer> valueToIndex = new HashMap<Integer, Integer>();
for(int i=0; i<inorder.length; i++) valueToIndex.put(inorder[i], i); // assuming there is not repeat value in node.一看,果然题目中说了。
return generateTree(preorder, 0, preorder.length-1, inorder, 0, inorder.length-1, valueToIndex);
}
private TreeNode generateTree(int[] preorder, int preLeft, int preRight, int[] inorder, int inLeft, int inRight, HashMap<Integer, Integer> map){
if( preLeft>preRight || inLeft>inRight ) return null;
TreeNode root = new TreeNode(preorder[preLeft]);
int dividingIndex = map.get(preorder[preLeft]);
root.left= generateTree(preorder,preLeft+1, preLeft+dividingIndex-inLeft, inorder, inLeft, dividingIndex-1, map);
root.right= generateTree(preorder, preLeft+dividingIndex-inLeft+1, preRight, inorder, dividingIndex+1, inRight, map);
return root;
}
}
这是我刚刚写上去的代码。套路很好用。关键点是确定片段长度。这不是什么难点,但是要求你要非常细心。
还有一道类似的题,其实应该是这道题的原型,把 一把 排序好的 int array 构建成一棵BST,关键就是根据 leftIndex 和 rightIndex 找到root,构建好root,然后递归构建好左子树和右子树。108, 109, todo: link;