题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 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);
}
};