Leetcode 98. 验证二叉搜索树 C++

题目描述

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
在这里插入图片描述
示例 2:
在这里插入图片描述

分析

本题我一开始的做法是按照深度优先的做法来实现,递归的判断每棵树的左右子树。每次判断其左儿子比它小,右儿子比它大,不过这样是不对的。为什么呢?请看下面的例子
在这里插入图片描述
从这个例子可以看出来,虽然以4为根的树确实满足右节点大于根,左节点小于根。但是不能保证所有的左子树的节点的值都小于根节点。因为7明显大于根节点5.
正确的做法:
下面给出的方法是相对好理解的,通过中序历遍的思想,可以得到按照 左节点–>根节点–>右节点 顺序排列的一个数组。只要这个数组是递增的,那么就可以说明满足二叉搜索树的条件。
关于树的历遍可以参看之前的一个博客,并且包含了leetcode的练习题。

解答

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if(!root) return true;
        vector<int> sequence;
        fun(root,sequence);
        for(int i=1;i<sequence.size();++i)
        {
            if(sequence[i-1]>=sequence[i]) return false;
        }
        return true;
    }
    void fun(TreeNode *root,vector<int> &sequence)
    {
        if(root==NULL) return;
        fun(root->left,sequence);
        sequence.push_back(root->val);
        fun(root->right,sequence);
    }
};

猜你喜欢

转载自blog.csdn.net/yuanliang861/article/details/83819011