leetcode每日题98. 验证二叉搜索树

题目来源这里验证二叉搜索树

二叉搜索树详细定义

我把题目复制到这里来~

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

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

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

输入:
2
*/ *
1 3
输出: true
示例 2:

输入:
5
*/ *
1 4
*/ *
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。

过程

思路

遍历二叉树,每次遍历弄清楚判断条件就行了。先看遍历二叉树的各种方法,因为是判断左边的节点小于右边的节点,用中序比较好理解。代码如下,详细的在注释。

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root) {
    // 如果只有一个节点,则是二叉搜索树
    if(root && root.right == null && root.left == null){
        return true;
    }
    // 存略过的节点,等下好按顺序取
    var tmpStack = [];
    // 当前节点,从顶开始
    var curNode = root;
    // 上一个节点
    var lastNode = null;
    while(curNode != null || tmpStack.length != 0){
        // 中序遍历:从最左边开始
        while(curNode != null){
            // 不是最左?那么存到tmpStack里等下再用
            tmpStack.push(curNode);
            // 当前节点的左节点,加上本while循环判断他左边是不是空
            curNode = curNode.left;
        }
        // 取到空值了才会到这里,所以要把最后一个存入的不为空的结点值取出来
        curNode = tmpStack.pop();
        // 比大小
        if(lastNode!==null && curNode.val <= lastNode){
            return false;
        }
        // 当前结点记录为上一结点,用于下次比较
        lastNode = curNode.val;
        // 往右找
        curNode = curNode.right;
    }
    return true;
};

尾巴

  1. 想起来学数据结构的时候就二叉树学的最好了,今天的题爱了爱了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值