判断是否是二叉查找树

给定一个二叉树,判断它是否是合法的二叉查找树(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相比较而得,但这样有重复查找

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/slowdreamer/article/details/48718613
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞