construct-binary-tree-from-preorder-and-inorder-traversal/submissions
题目描述
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder,int[] inorder){
// 划重点:假设树中没有重复的元素
if(preorder.length == 0 && inorder.length == 0){
return null;
}else if(preorder.length == 1 && inorder.length == 1){
return new TreeNode(preorder[0]);
}
int rootVal = preorder[0];
TreeNode root = new TreeNode(rootVal);
int leftsize = 0;//左孩子中结点的个数
for(int i=1;i<inorder.length;i++){
if(inorder[i] == rootVal){
leftsize = i;
}
}
int rightsize = inorder.length - leftsize - 1;
// copyOfRange函数前闭后开
int[] leftPreorder;
int[] leftInorder;
int[] rightPreorder;
int[] rightInorder;
if(leftsize!=0){
// 若存在左孩子
leftPreorder = Arrays.copyOfRange(preorder, 1, 1+leftsize);
leftInorder = Arrays.copyOfRange(inorder, 0, leftsize);
}else{
leftPreorder = new int[0];// 空数组
leftInorder = new int[0];
}
if(rightsize!=0){
// 若存在右孩子
rightPreorder = Arrays.copyOfRange(preorder,1+leftsize,preorder.length);
rightInorder = Arrays.copyOfRange(inorder,1+leftsize,inorder.length);
}else{
rightPreorder = new int[0];// 空数组
rightInorder = new int[0];
}
root.left = buildTree(leftPreorder,leftInorder);
root.right = buildTree(rightPreorder,rightInorder);
return root;
}
}