Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
用中序找子树序列个数,在先序中找该长度子序列第一个元素作为子树root
Source
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length == 0 || preorder.length != inorder.length) return null;
return buildT(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
public TreeNode buildT(int[] preorder, int pstart, int pend, int[] inorder, int istart, int iend){
if(istart > iend) return null;
TreeNode root = new TreeNode(preorder[pstart]); //先序片段中的第一个总是当前片段的根节点,用中序来辅助找先序片段从而确定根节点
if(pstart == pend) return root;
int i = 0;
while(preorder[pstart] != inorder[i]){ //找片段
i++;
}
int leftsize = i - istart; //左子树节点长度
root.left = buildT(preorder, pstart + 1, pstart + leftsize, inorder, istart, i - 1); //inorder的边界只与i有关
root.right = buildT(preorder, pstart + leftsize + 1, pend , inorder, i + 1 , iend); //有边界写pend即可 因为执行到此步时pend已经根据root.left做出了改变,此步只需沿用上步得出的pend即可
return root;
}
}
Test
public static void main(String[] args){
int[] preorder = {4,2,1,3,6,5,7};
int[] inorder = {1,2,3,4,5,6,7};
TreeNode root = new Solution().buildTree(preorder, inorder);
new Solution().print(root);
}
public void print(TreeNode root){
if(root != null) System.out.println(root.val);
if(root.left != null) print(root.left);
if(root.right != null) print(root.right);
}