程序员面试金典——面试题 04.05. 合法二叉搜索树

一、题目介绍

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

示例 1:
输入:
    2
   / \
  1   3
输出: true
示例 2:
输入:
    5
   / \
  1   4
     / \
    3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/legal-binary-search-tree-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

       二叉搜索树的特点,中序遍历可以得到一组升序序列,即先遍历到的节点要小于后遍历到的节点。本题考查二叉树的中序遍历。

三、解题代码

1、递归方法

class Solution {
private:
    long val;
    bool flag;
public:
    //二叉搜索树的特点:中序遍历时为有序的
    bool isValidBST(TreeNode* root) {
        val = LONG_MIN;
        flag = true;
        dfs(root);
        return flag;
    }


    void dfs(TreeNode* root)
    {
        if(!root || !flag)
        {
            return;
        }
        dfs(root->left);
        if(root->val > val)
        {
            val = root->val;
        }
        else
        {
            flag = false;
            return;
        }
        dfs(root->right);
    }
};

2、非递归法

class Solution {
public:
    //二叉搜索树的特点:中序遍历时为有序的,即后遍历到的节点大于先遍历到的节点
    bool isValidBST(TreeNode* root) {
        if(!root)
            return true;
        stack<TreeNode*> st;
        TreeNode* pNode = NULL;
        while(!st.empty() || root)
        {
            while(root)
            {
                st.push(root);
                root = root->left;
            }
            root = st.top();
            st.pop();
            if(pNode && pNode->val >= root->val)
                return false;
            pNode= root;
            root = root->right;
        }
        return true;
    }
};

四、解题结果

猜你喜欢

转载自blog.csdn.net/qq_39661206/article/details/108055082