105. 从前序和中序遍历序列构造二叉树

题目

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

思路

前序遍历[0]是二叉树的根
在中序遍历中找到根节点的位置
左边的都是左子树
右边的都是右子树。
后递归

代码

package binaryTree;

import java.util.Arrays;

public class o105 {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n = preorder.length;
        if(n==0){
            return null;
        }
        int leftSize = indexOf(inorder,preorder[0]);
        int[] pre1 = Arrays.copyOfRange(preorder,1,1+leftSize);
        int[] pre2= Arrays.copyOfRange(preorder,leftSize+1,n);
        int[] in1=Arrays.copyOfRange(inorder,0,leftSize);
        int[] in2 =Arrays.copyOfRange(inorder,leftSize+1,n);
        TreeNode left =  buildTree(pre1,in1);
        TreeNode right =  buildTree(pre2,in2);
        return new TreeNode(preorder[0],left,right);
    }
    private int indexOf(int[] a, int x){
        for(int i = 0; ; i++){
            if (x == a[i]){
                return i;
            }
        }
    }
}
posted @ 2025-05-02 13:32  kuki'  阅读(23)  评论(0)    收藏  举报