具体的思路就是递归,遍历中序数组,在前序中找相同的。因为前序是"根左右",而中序是’左根右",所以中序中匹配的前序数字的前面所有数字都是该树的左节点,而后面的数字就是该树的右节点
这里是主要的逻辑
Node node = new Node(preorder[preStart]);
for(int i = inStart;i <= inEnd;i++) {
if(preorder[preStart] == inorder[i]) {
node.left = toBuild(preorder, inorder, i+1, preStart + (i - inStart),inStart,i-1);
node.right = toBuild(preorder, inorder, i-inStart+preStart+1, preEnd, i+1,inEnd);
}
}
return node;
class Node{
int val;
Node left;
Node right;
public Node(int val){
this.val = val;
}
public void println(Node root){
if(root != null){
Node left = root.left;
Node right = root.right;
System.out.println(right.val);
println(left);
println(right);
}
}
}
public class RebuildBinaryTree{
public Node build(int[] preorder,int[] inorder){
Node result = toBuild(preorder, inorder, 0, preorder.length-1,0,inorder.length-1);
return result;
}
public Node toBuild(int[]preorder,int[] inorder,int preStart,int preEnd,int inStart,int inEnd){
if(preStart>preEnd || inStart>inEnd){
return null;
}
Node node = new Node(preorder[preStart]);
for(int i = inStart;i <= inEnd;i++) {
if(preorder[preStart] == inorder[i]) {
node.left = toBuild(preorder, inorder, i+1, preStart + (i - inStart),inStart,i-1);
node.right = toBuild(preorder, inorder, i-inStart+preStart+1, preEnd, i+1,inEnd);
}
}
return node;
}
public static void main(String[] args){
int[] preorder = {3,9,20,15,7};
int[] inorder = {9,3,15,20,7};
Node node = new RebuildBinaryTree().build(preorder, inorder);
System.out.println(node);
}
}