[LeetCode] Construct Binary Search Tree from Preorder Traversal

Return the root node of a binary search tree that matches the given preorder traversal.

(Recall that a binary search tree is a binary tree where for every node, any descendant of node.left has a value < node.val, and any descendant of node.right has a value > node.val. Also recall that a preorder traversal displays the value of the node first, then traverses node.left, then traverses node.right.)

Example 1:

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

Note:

1 <= preorder.length <= 100
The values of preorder are distinct.

解题思路

题目给出了先序遍历的结果,根据二叉搜索树的性质,我们知道左子树的节点都是小于根节点的,右子树的节点都是大于根节点的。所以做法如下:

  1. 根据第一个元素构造根节点
  2. 将除第一个元素外的其他元素按照大于或者小于根节点拆分为两个数组。
  3. 用小于根节点的数组构造左子树。
  4. 用大于根节点的数组构造右子树。

实现代码

// Runtime: 1 ms, faster than 82.36% of Java online submissions for Construct Binary Search Tree from Preorder Traversal.
// Memory Usage: 36.9 MB, less than 100.00% of Java online submissions for Construct Binary Search Tree from Preorder Traversal.
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode bstFromPreorder(int[] preorder) {
        if (preorder.length == 0) {
            return null;
        } else if (preorder.length == 1) {
            return new TreeNode(preorder[0]);
        } else {
            TreeNode root = new TreeNode(preorder[0]);
            int index = split(preorder);
            if (index > 1) {
                root.left = bstFromPreorder(Arrays.copyOfRange(preorder, 1, index));
            } 
            if (index < preorder.length) {
                root.right = bstFromPreorder(Arrays.copyOfRange(preorder, index, preorder.length));
            }
            return root;
        }
    }

    private int split(int[] preorder) {
        for (int i = 1; i < preorder.length; i++) {
            if (preorder[i] > preorder[0]) {
                return i;
            }
        }
        return preorder.length;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录 简书的 markdown 都不支持 [TOC] 语法……我就不贴目录了。下面按照类别,列出了29道关于二叉树...
    被称为L的男人阅读 8,616评论 0 8
  • 总结类型: 完全子树(#222) BST(左右子树值的性质,注意不仅要满足parent-child relatio...
    __小赤佬__阅读 3,984评论 0 0
  • 94. Binary Tree Inorder Traversal 中序 inorder:左节点->根节点->右节...
    Morphiaaa阅读 3,777评论 0 0
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 18,113评论 2 36
  • 姓名:周立 zhou li 公司:宁波大发化纤有限公司 【日精进打卡第96天】 【知~学习】 (六项精进)大纲背...
    周立zhouli阅读 1,677评论 0 0