首先说明一下二叉树和二叉搜索树的区别。二叉树指这样的树结构,它的每个结点的孩子数目最多为2个;二叉搜索树是一种二叉树,但是它有附加的一些约束条件,这些约束条件必须对每个结点都成立:
- 结点node的左子树所有结点的值都小于node的值。
- 结点node的右子树所有结点的值都大于node的值。
- 结点node的左右子树同样都必须是二叉搜索树。
假定当前结点值为k。对于二叉树中每个结点,判断其左孩子的值是否小于k,其右孩子的值是否大于k。如果所有结点都满足该条件,则该二叉树是一棵二叉搜索树。如果按这个定义的算法,会出现错误。
10 / \ 5 15 -------- binary tree (1) / \ 6 20
以上满足代码但不是查找二叉树,因此需要判断所有左节点是否都小于根节点,所有右节点是否都大于根节点。
/**
* 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;
return isSubTreeLessThan(root->left, root->val) &&
isSubTreeGreaterThan(root->right, root->val) &&
isValidBST(root->left) &&
isValidBST(root->right);
}
bool isSubTreeLessThan(TreeNode *p, int val)
{
if (!p) return true;
return (p->val < val &&
isSubTreeLessThan(p->left, val) &&
isSubTreeLessThan(p->right, val));
}
/*判断右子树的结点值是否都大于val*/
bool isSubTreeGreaterThan(TreeNode *p, int val)
{
if (!p) return true;
return (p->val > val &&
isSubTreeGreaterThan(p->left, val) &&
isSubTreeGreaterThan(p->right, val));
}
};