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

该博客探讨了如何判断一个二叉树是否符合二叉搜索树的定义,即每个节点的值大于其左子树所有节点的值且小于其右子树所有节点的值。通过中序遍历的方法,博主提供了两种解决方案:一种是递归实现,另一种是使用栈进行非递归实现。两种方法都确保在遍历过程中得到的序列是严格递增的,从而判断树的合法性。
摘要由CSDN通过智能技术生成

https://leetcode-cn.com/problems/legal-binary-search-tree-lcci/
判断一个二叉搜索树是否合法。

考察二叉搜索树的定义,注意这里不包括等于号。

思路:按照(左子树,当前节点,右子树)(不记得是什么遍历)去遍历,得到的序列应该是严格递增的,由此判断。

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if (root == NULL) return true;
        cnt = 0;
        myD(root);
        for (int i = 1; i < cnt; i++) {
            if (a[i-1]>=a[i]) {
                return false;
            }
        }
        return true;
    }
    int a[10000];
    int cnt;
    void myD(TreeNode* cur) {
        if (cur->left != NULL) myD(cur->left);
        a[cnt++] = cur->val;
        if (cur->right != NULL) myD(cur->right);
    }
};

前几天面试有类似不让写递归的,没写出来很尴尬。

递归本质大概是pc指针压栈,实现非递归算法版本大概利用栈就可以了。上面的应该是中序遍历用栈优化下。中序结果缓存前一位就好了,不用存储整个遍历结果。

class Solution {
public:
    stack<TreeNode*> s;
    bool isValidBST(TreeNode* root) {
        if (root == NULL) return true;
        TreeNode* cur = root;
        int thL = -0x7fffffff;
        bool o = true;
        while (!s.empty() || cur) {
            if (cur) {
                s.push(cur);
                cur = cur->left;
            }
            else {
                cur = s.top();
                s.pop();
                if (cur == NULL) continue;
                if (o) {
                    thL = cur->val;
                    cur = cur->right;
                    o = false;
                    continue;
                }
                if (thL >= cur->val) {
                    return false;
                }
                else {
                    thL = cur->val;
                }
                cur = cur->right;
            }
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzzlnb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值