面试题 04.05. 合法二叉搜索树

113 阅读1分钟

题目描述

实现一个函数,检查一棵二叉树是否为二叉搜索树。

解题思路

算法,数据结构

递归

思路

对于一颗二叉搜索树,要检查他的中序遍历结果是否为升序

过程

我通过递归来不断的检查中间节点值是否大于左节点值,右节点值是否大于中间节点值

我通过一个 stack 来存储上一个节点的值,然后每一次递归的结果都会存储在 isValid 变量中,如果 isValidfalse,则说不满足题目要求,检查结束

接下来实现递归的过程:

递归的函数接受两个参数,root, stack,其中

root 是本轮递归的中间节点,stack 是存储上一个遍历节点值的栈

检查 root 是否为 null,如果是,返回 true

然后声名一个变量 isValid,它保存我们检查是否符合要求的结果

接下来是检查左,中,右节点的过程

首先递归 root.left,然后检查 stack 中的元素是否符合要求,即

stack.pop() < root.val

然后把 root.val pushstack 中,检查右节点

最终检查完 左 < 中 < 右 之后,返回 isValid

代码

/**
 * 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) {
    const stack = []

    return inOrder(root, stack)
};

function inOrder(root, stack) {
    if (!root) return true
    let isValid = true
    if (root.left) isValid = inOrder(root.left, stack)
    if (!isValid  || stack.pop() >= root.val ) return false
    stack.push(root.val)

    isValid = inOrder(root.right, stack)
    return isValid
}