C++速通LeetCode中等第24题-验证二叉搜索树(中序遍历堆栈迭代法)(详细注释)

class Solution{
public:
    // 验证二叉搜索树  整体思路:中序遍历取到的root->val一定是递增的,循环中上一次的root->val就保存为min,和这次的val对比。一开始最小的最左下节点的val和LONG_MIN比,此后min从LONG_MIN更新为每次遍历取到的val
    bool isValidBST(TreeNode *root){
        // 记录当前的最小值
        long min=LONG_MIN;
        // 用栈来缓存进行中序遍历
        stack<TreeNode *> temp;
 
        // 如果栈不空或二叉搜索树没有遍历完毕
        // 就继续循环
        while(!temp.empty()||root!=nullptr){
            // 如果没有遍历到叶子结点
            while(root!=nullptr){
                // 将当前节点入栈
                temp.push(root);
                // 在遍历到叶子结点之前持续遍历左子树
                root=root->left;
            }
            
            // 将栈顶节点出栈
            root=temp.top();
            // 弹出栈顶节点
            temp.pop();
            // 如果根节点的值小于左子树的最大值
            if(root->val<=min){
                // 表明不满足二叉搜索树节点大小的性质
                return false;
            }
            
            // 如果满足性质,更新左子树的最大值
            min=root->val;
            // 在遍历完左子树和根节点之后
            // 转向遍历遍历右子树
            root=root->right;
        }
        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值