根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/
9 20
/
15 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
TreeNode root = build(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
return root;
}
TreeNode build(int[] preorder,int prestart,int preend,int[] inorder,int instart,int inend){
//base case
if(prestart > preend){
return null;
}
//寻找出根节点的下标
int index = 0;
for(int i = instart;i <= inend;i++){
if(inorder[i] == preorder[prestart]){
index = i;
break;
}
}
//确定左子树的元素个数
int leftSize = index - instart;
//先构造出当前节点
TreeNode root = new TreeNode(preorder[prestart]);
//构造出左右子树
root.left = build(preorder,prestart+1,prestart+leftSize,inorder,instart,index-1);
root.right = build(preorder,prestart+leftSize+1,preend,inorder,index+1,inend);
return root;
}
}