LeetCode -- 前序遍历构造二叉搜索树

249 阅读1分钟

例子:

Input: [8,5,1,7,10,12]
Output: [8,5,10,1,7,null,12]

方法1:使用递归的方法,将小于第一个节点的值作为left,大于第一个节点的值作为right,不断递归.

public TreeNode bstFromPreorder(int[] preorder){
    int n = preorder.length;
    if(n == 0){
        return null;
    }
    int rootValue = preorder[0];
    int[] left = new int[n];
    int[] right = new int[n];
    int leftIndex = 0;
    int rightIndex = 0;
    
    for(int i=1; i<n;i++){
        if(preorder[i] < rootValue){
            left[leftIndex++]= preorder[i];
        }else{
            right[rightIndex++] = preorder[i];
        }
    }
    TreeNode root = new TreeNode(rootValue);
    root.left = bstFromPreorder(Arrays.copyOfRange(left,0,leftIndex));
    root.right = bstFromPreoder(Arrays.copyOfRange(right,0,rightIndex));
    return root;
}

方法2:一个root,一定满足left以及left的所有子节点的值小于root,right以及right的所有子节点的值大于root,所以借助于变量index,使用一次循环即可完成前序遍历二叉树的构建.

    int index = 0;
    public TreeNode bstFromPreorder(int[] preorder){
        if(preorder == null || preorder.length == 0){
            return null;
        }
        return bstFromPreorderHelper(preorder,Integer.MIN_VALUE,Integer.MAX_VALUE);
    }
    public TreeNode bstFromPreorderHelper(int[] preorder, int min, int max){
        if(index >= preorder.length){
            return null;
        }
        TreeNode node = null;
        int key = preorder[index];
        if(key > min && key < max){
            node = new TreeNode(key);
            index++;
            node.left = bstFromPreorderHelper(preorder,min,key);
            node.right = bstFromPreorderHelper(preorder,key,max);
        }
        return node;
    }