【LeetCode 30天挑战活动】Day 20. Construct Binary Search Tree from Preorder Traversal

题目描述

根据给定的二叉搜索树的先根遍历,把二叉搜索树建立起来,返回它的根

由于涉及到二叉树,光用文字描述可能会不好理解,可以点击直接看题目

解题思路

这道题最关键的是要充分利用二叉搜索树的特点。
先明确一下二叉搜索树的概念:

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值

我们对照一棵二叉搜索树的先根遍历数组来看:[8,5,1,7,10,12]
既然是先根,那么第0个元素必然是整个二叉树的根,这个很容易理解。由于在二叉搜索树中,左子树节点的值都小于根节点的值,那么从第1个元素开始往后找,直到找到最后一个小于根节点的值,这部分就是根节点的左子树,那么自然而然数组后面的元素就是根节点的右子树,值都大于根节点的值,然后递归处理就可以。
代码如下:

class Solution {
    public TreeNode bstFromPreorder(int[] preorder) {
        if (preorder == null || preorder.length == 0)
            return null;
        
        TreeNode root = new TreeNode(preorder[0]);
        
        int index = 1;
        for (; index < preorder.length; ++index) {
            if (preorder[index] > preorder[0])
                break;
        }
        
        root.left = bstFromPreorder(Arrays.copyOfRange(preorder, 1, index));
        root.right = bstFromPreorder(Arrays.copyOfRange(preorder, index, preorder.length));
        
        return root;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值