题目链接
题目描述(Description)
Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less than the node’s key.
The right subtree of a node contains only nodes with keys greater than the node’s key.
Both the left and right subtrees must also be binary search trees.
翻译
给一个二叉树,确定它是否是一个有效的二叉排序树(BST)。
一个二叉排序树定义如下:
一个结点(非终端结点)的值不小于其左子树的值;
一个结点(非终端结点)的值不大于其右子树的值;
所有的左子树和右子树也必须是二叉排序树。
分析
二叉排序树对我们来说其实并不陌生,因为二分法查找
的逻辑就是二叉排序树。
此题的突破口是二叉树的遍历顺序:二叉排序树的中序遍历是有序的
。所以只要根据中序遍历
规则,依次判断是否满足二叉排序树的规则即可。
定义一个变量
pre
(本题的数据范围较大,已经超出int
,经测试long long
合适;开始
中序遍历
:从左子树
开始,递归
左子树是否满足条件;根节点
,判断pre
与根节点值
的大小,如果pre>=root->val
,则返回false
;遍历到右结点
,递归
右子树是否满足条件。中序遍历结束,如果所有条件都满足,则返回
true
。
代码
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
long long pre;
bool inorder(TreeNode *root){
if(root==NULL)
return true;
if(!inorder(root->left))
return false;
if(pre>=root->val)
return false;
pre=root->val;
if(!inorder(root->right))
return false;
return true;
}
bool isValidBST(TreeNode *root) {
pre=numeric_limits<long long>::min();//pre初始化为最小值,`numeric_limits<long long>::min();`是C++标准程序里提供的极小值
return inorder(root);
}
};