- 算法
分治算法 - 核心思想
可以根据前序遍历找到每一颗树的根节点,将中序遍历分为两个部分,分别定义左子树方法和右子树方法。 - 代码
class Solution {
int num = 0;
public TreeNode buildTree(int[] preorder, int[] inorder) {
TreeNode root = new TreeNode(preorder[0]);
int i = 0;
for(;i < inorder.length;++i){
if(inorder[i] == preorder[0]) break;
}
num++;
leftTree(preorder,inorder,root,0,i-1,1);
rightTree(preorder,inorder,root,i+1,inorder.length-1,i+1);
return root;
}
void leftTree(int[] preorder, int[] inorder,TreeNode root,int start,int end,int web){
if (start == end){
root.left = new TreeNode(inorder[start]);
num++;
return;
}
if (start > end) return;
int i = start;
for(;i <= end;++i){
if(inorder[i] == preorder[web]) break;
}
root.left = new TreeNode(preorder[web]);
root = root.left;
num++;
leftTree(preorder,inorder,root,start,i-1,web+1);
rightTree(preorder,inorder,root,i+1,end,num - 1 > i ? num : i+1);
}
void rightTree(int[] preorder, int[] inorder,TreeNode root,int start,int end,int web){
if (start == end){
root.right = new TreeNode(inorder[start]);
num++;
return;
}
if (start > end) return;
int i = start;
for(;i <= end;++i){
if(inorder[i] == preorder[web]) break;
}
root.right = new TreeNode(preorder[web]);
root = root.right;
num++;
leftTree(preorder,inorder,root,start,i-1,web+1);
rightTree(preorder,inorder,root,i+1,end,num - 1 > i ? num : i+1);
}
}