Given preorder and inorder 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:
preorder = {7,10,4,3,1,2,8,11} inorder = {4,10,3,1,7,11,8,2}这里可以发现,preorder中每个数的后一个数都是他的左节点,令他在inorder里的位置是,那么 他的右节点是prestart + index - 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[] preorder, int[] inorder) {
return helper(0, 0, inorder.length - 1, preorder, inorder);
}
private TreeNode helper (int prestart, int instart, int inend, int[] preorder, int[] inorder) {
if (prestart > preorder.length || instart > inend) {
return null;
}
TreeNode root = new TreeNode(preorder[prestart]);
int index = 0;
for (int i = 0; i < inorder.length; i ++) {
if (inorder[i] == root.val) {
index = i;
break;
}
}
root.left = helper(prestart + 1, instart, index - 1, preorder, inorder);
root.right = helper(prestart + index - instart + 1, index + 1, inend, preorder, inorder);
return root;
}
}