给定一个二叉树,判断它是否是合法的二叉查找树(BST)
一棵BST定义为:
- 节点的左子树中的值要严格小于该节点的值。
- 节点的右子树中的值要严格大于该节点的值。
- 左右子树也必须是二叉查找树。
样例
一个例子:
1 / \ 2 3 / 4 \ 5
解答:
容易忽略根节点要大于所有左子树的节点,从而写出下面的错误代码
class Solution {
public:
bool isValidBST(TreeNode *root) {
if(root == NULL) {
return true;
}
bool l = isValidBST(root->left);
if(isValidBST(root->right)==false) {
return false;
}
if(isValidBST(root -> right) == false ) {
return false;
}
//return true;
return true;
}
};
可以根据二叉查找树中序遍历所得结果严格递增的规律,记录上一个访问的节点,和本节点比较
class Solution {
public:
bool isValidBST(TreeNode *root) {
if(root == NULL) {
return true;
}
if(isValidBST(root->left)==false) {
return false;
}
if(pre!=NULL && pre->val>=root->val) {
return false;
}
pre=root;
if(isValidBST(root->right)==false) {
return false;
}
return true;
}
private:
TreeNode *pre=NULL;
};
http://blog.csdn.net/brucehb/article/details/48014805文中用查找左子树最大和右子树最小分别和root相比较而得,但这样有重复查找