返回与给定前序遍历 preorder 相匹配的二叉搜索树(binary search tree)的根结点。
(回想一下,二叉搜索树是二叉树的一种,其每个节点都满足以下规则,对于 node.left 的任何后代,值总 < node.val,而 node.right 的任何后代,值总 > node.val。此外,前序遍历首先显示节点 node 的值,然后遍历 node.left,接着遍历 node.right。)
题目保证,对于给定的测试用例,总能找到满足要求的二叉搜索树。
示例:
输入:[8,5,1,7,10,12] 输出:[8,5,10,1,7,null,12]
提示:
- 1 <= preorder.length <= 100
- 1 <= preorder[i] <= 10^8
- preorder中的值互不相同
Related Topics
题解
思路和LeetCode刷题【剑指 Offer 33】二叉搜索树的后续遍历序列一样了,根据前序遍历的特性,一样的第一位为根节点,后面的序列中,比根节点小的为左子树上的节点,比根节点大的为右子树上的节点
//leetcode submit region begin(Prohibit modification and deletion)
/**
 * 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 bstFromPreorder(int[] preorder) {
        return buildTree(preorder,0,preorder.length-1);
    }
    private TreeNode buildTree(int[] preorder,int left ,int right){
        //必要判断条件,如果区间范围不成立,表名没有这个节点
        if (left > right || left < 0 || right < 0) return null;
        //根据前序遍历的特性,该连续数组的第一位为这个树的根节点
        TreeNode node = new TreeNode(preorder[left]);
        if (left==right){
            return node;
        }
        //首位为根节点,往后进一格,处理子节点
        left++;
        //预设一个-1标记
        int rightStart = -1;
        for (int i = left; i <= right ; i++) {
            if (preorder[i]>node.val){
                //如果当前节点比根节点大
                //那么从当前节点开始,往后的都是右子节点
                rightStart = i;
                break;
            }
        }
        //如果没有找到右子节点的话,因为之前预设了-1,需要额外判断下右子节点的开始位置
        //不然还是-1,
        //没有找到右子节点的区间的话,说明左子节点区间应该为从left到right都是
        if (rightStart == -1){
            rightStart = right+1;
        }
        //分别拿出左右子节点区间继续判断处理
        node.left = buildTree(preorder,left,rightStart-1);
        node.right = buildTree(preorder,rightStart,right);
        return node;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
发表评论