题目描述
实现一个函数,检查一棵二叉树是否为二叉搜索树。
解题思路
算法,数据结构
递归
思路
对于一颗二叉搜索树,要检查他的中序遍历结果是否为升序
过程
我通过递归来不断的检查中间节点值是否大于左节点值,右节点值是否大于中间节点值
我通过一个 stack 来存储上一个节点的值,然后每一次递归的结果都会存储在 isValid 变量中,如果 isValid 为 false,则说不满足题目要求,检查结束
接下来实现递归的过程:
递归的函数接受两个参数,root, stack,其中
root 是本轮递归的中间节点,stack 是存储上一个遍历节点值的栈
检查 root 是否为 null,如果是,返回 true
然后声名一个变量 isValid,它保存我们检查是否符合要求的结果
接下来是检查左,中,右节点的过程
首先递归 root.left,然后检查 stack 中的元素是否符合要求,即
stack.pop() < root.val
然后把 root.val push 到 stack 中,检查右节点
最终检查完 左 < 中 < 右 之后,返回 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
}