LeetCode 之 JavaScript 解答第98题 —— 验证二叉搜索树

栏目: 数据库 · 发布时间: 5年前

内容简介:Time:2019/4/24Title: Vaildata Binary Search TreeDifficulty: Medium

Time:2019/4/24

Title: Vaildata Binary Search Tree

Difficulty: Medium

Author: 小鹿

题目:Vaildata Binary Search Tree(验证二叉搜索树)

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

Example 1:

Input:
    2
   / \
  1   3
Output: true

Example 2:

5
   / \
  1   4
     / \
    3   6
Output: false
Explanation: The input is: [5,1,4,null,null,3,6]. The root node's value
             is 5 but its right child's value is 4.

Solve:

▉ 问题分析

看到此题的入手点就是上方提出的三点二叉搜索树的三点要求:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

1)以上三点要求最容易解决的就是一个中序遍历,判断遍历出的每个元素后一个元素是否大于前一个元素,如果不符合条件,那么就不是一个二分搜索树。

▉ 算法思路

2)定义一个边界值赋予 max 变量。每遍历一次,如果符合前后大小的要求,就将当前节点的值赋值给 max 变量,用于下一次遍历的结点的大小比较。如果不符合要求,我们将其布尔变量置为 false。
3)整个过程是用递归来解决的,在理解上还是有点不符合常规思路的。也是整个问题分析中最重要的一点。

▉ 代码实现

var isValidBST = function(root) {
    // boolean 变量
    let isValidBSTFlag = true;
    // 最大值变量
    let max = -Number.MAX_VALUE;
    const orderSearch = root => {
        // 终止条件(判断当前结点是否为 null)
        if (root) {
            // 中序遍历
            orderSearch(root.left);
            // 判断遍历前后的值是否逐渐升序
            if (root.val > max) {
                // 存储当前结点值,进行下一次比较
                max = root.val;
            } else {
                // 当前节点值小于前一结点值,返回 false
                isValidBSTFlag = false;
            }
            orderSearch(root.right);
        }
    }
    orderSearch(root);
    return isValidBSTFlag;
};

欢迎一起加入到 LeetCode 开源 Github 仓库,可以向 me 提交您其他语言的代码。在仓库上坚持和小伙伴们一起打卡,共同完善我们的开源小仓库!

Github: https://github.com/luxiangqia...

欢迎关注我个人公众号:「一个不甘平凡的码农」,记录了自己一路自学编程的故事。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

解码宇宙

解码宇宙

(美) 塞费 / 隋竹梅 / 上海科技教育出版社 / 2010-4 / 26.00元

《解码宇宙:新信息科学看天地万物》:宇宙,或许就是一台庞大的计算机。这是查尔斯·塞费在《解码宇宙:新信息科学看天地万物》中对宇宙做出的结论。作者从信息的特点开始谈起,详细论述了信息论和量子计算,向我们展示了一种不可思议的拜占庭式宇宙的情景,涉及生命的本质、热力学、相对论、量子力学、黑洞、多重宇宙,直至宇宙的命运。《解码宇宙:新信息科学看天地万物》资料翔实,内容丰富多彩,思路清晰,观点明确,读后使人......一起来看看 《解码宇宙》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具