[二叉搜索树]leetcode98:验证二叉排序树(medium)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43152052/article/details/100165146

题目:
在这里插入图片描述

题解:

二叉搜索树也称二叉排序树,性质如下:
1)若这棵树的左子树不为空,那么左子树上的所有节点的值都必须小于它的根节点的值
2)若这棵树的右子树不为空,那么右子树上的所有节点的值都必须大于它的根节点的值
3)它的左右子树也是二叉排序树

对于我们使用递归的方式解题,更加加深对递归的理解,这里我们把递归当作一个栈(当然递归调用的确实是系统栈),先递归将左子树的所有节点压入栈中,直到遇到叶子节点。遇到叶子节点时,我们的递归需要进行回溯了,也就是栈顶元素要出栈了,val指向栈顶元素,然后将栈顶元素弹出栈,val与此时的栈顶元素进行比较(这个栈顶元素可能是上一个节点的父节点,也可能是上一个节点的右孩子节点),如果是父节点,那么val指向的值要小于父节点的值,如果是兄弟节点,那么val指向的值要小于右孩子节点的值,否则就不是二叉排序树了。最后回溯到根节点时,也就是栈顶元素为根结点时,那么它的右子树的所有节点都必须大于根结点的值,如果小于根节点的值,那么就不是排序二叉树了。整个递归的思想就是如此了,大家还有不懂的,可以自己画图理清思路。

代码如下:

class Solution {
public:
    int *val=nullptr;
    bool isValidBST(TreeNode* root) {
        //到达叶子节点返回true
        if(root==nullptr)
            return true;
        else
        {
            //左子树不是排序二叉树,则直接返回false
            if(!isValidBST(root->left))return false;
            
            //将递归看成压栈,val表示的就是指向栈顶元素的值
            //左子树的所有节点压入完成时,开始进行弹栈,val(实际意义:表示的是下层的左节点值)都要小于上一层的根节点值,每次val更新到上一层的根节点值(左子树的根节点)(由下到上)
            //左子树弹栈到最初的root时,那么开始将右子树的节点值压入栈中,val(实际意义:表示上层的右子树根节点值)都要小于下一层的右节点的值,每次比较完更新val的值为下一层的右节点值(由上到下)
            if(val!=nullptr&&*val>=root->val)return false;
            val=&root->val;//更新val的值
            
            //右子树不是排序二叉树,则直接返回false
            if(!isValidBST(root->right))return false;
            return true;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/100165146