题目:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
思路:在网上找了大神的代码。原文链接:https://blog.csdn.net/u010771890/article/details/52964578。以下的代码整体上是递归的思路。前序数组中的第一个节点pre[0]为根节点,在中序数组中找到其对应的值in[j].其中j之前的为根节点的左子树,之后的为根节点是右子树。按照递归的思路可以解决。
我自己写的时候,思路都知道,但是d代码写不对。有好多临界条件写不对。。。。
代码:
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return build(0,0,inorder.length-1,preorder,inorder);
}
private TreeNode build(int prestart,int instart,int inend,int[]preorder,int[]inorder){
if(prestart>preorder.length-1||instart>inend){
return null;
}
TreeNode root=new TreeNode(preorder[prestart]);
int inindex=0;
for(int i=instart;i<=inend;i++){
if(inorder[i]==root.val){
inindex=i;
break;
}
}
root.left=build(prestart+1,instart,inindex-1,preorder,inorder);
root.right=build(prestart+inindex-instart+1,inindex+1,inend,preorder,inorder);
return root;
}
}
执行最快的代码:
执行最快的代码和上面的代码思路基本上是一样的
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder.length == 0) {
return null;
}
return func(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
}
private TreeNode func(int[] preorder, int[] inorder, int begin1, int end1, int begin2, int end2) {
if (begin1 == preorder.length) {
return null;
}
TreeNode root = new TreeNode(preorder[begin1]);
if (begin1 == end1) {
return root;
}
for (int index = end2; index >= begin2; index--) {
if (preorder[begin1] == inorder[index]) {
int length = index - begin2;
root.left = func(preorder, inorder, begin1 + 1, begin1 + length, begin2, index - 1);
root.right = func(preorder, inorder, begin1 + length + 1, end1, index + 1, end2);
return root;
}
}
return null;
}
}