Fork me on GitHub

98. Validate Binary Search Tree

98. 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.

Example 1:

    2
   / \
  1   3

Binary tree [2,1,3], return true.

Example 2:

    1
   / \
  2   3

Binary tree [1,2,3], return false. 

解析

  • 需要注意的是,左子树的所有节点都要比根节点小,而非只是其左孩子比其小,右子树同样。这是很容易出错的一点是,很多人往往只考虑了每个根节点比其左孩子大比其右孩子小。如下面非二分查找树,如果只比较节点和其左右孩子的关系大小,它是满足的。
  • 从根节点开始递归,遍历所有的节点。并且在每个节点处,分别遍历其左右子树,判断其左子树的最大值比其小,右子树的最小值比其大。时间复杂度为O(n^2)。参考:【LeetCode】Validate Binary Search Tree 解题报告
  • 这题实际上简化了难度,因为一般的二叉搜索树是左<=根<右,而这道题设定为左<根<右,那么就可以用中序遍历来做。因为如果不去掉左=根这个条件的话,那么下边两个数用中序遍历无法区分:
    20 20
    /
    20 20
  • 它们的中序遍历结果都一样,但是左边的是BST,右边的不是BST。去掉等号的条件则相当于去掉了这种限制条件。参考:98. Validate Binary Search Tree
class Solution_98 {
public:

	//bug
	bool isValidBST_bug(TreeNode* root) {

		if (!root||(!root->right&&!root->left))
		{
			return true;
		}
		
		if (root->left!=NULL&&root->left->val>=root->val)
		{
			return false;
		}
		if (root->right!=NULL&&root->right->val<=root->val)
		{
			return false;
		}
		return isValidBST_bug(root->left) && isValidBST_bug(root->right);
	}

	// 二分查找树的中序遍历结果是一个递增序列
	TreeNode* pre = NULL;
	void InOrder(TreeNode* root,int &res)
	{
		if (!root)
		{
			return;
		}
		InOrder(root->left, res);
		if (!pre)
		{
			pre = root;
		}
		else
		{
			if (root->val<=pre->val)
			{
				res = 0;
			}
			pre = root;
		}

		InOrder(root->right,res);
		return;
	}
	bool isValidBST(TreeNode *root) {

		if (!root)
		{
			return true;
		}
		int res = 1;
		InOrder(root,res);

		if (res==0)
		{
			return false;
		}
		return true;
	}
};

题目来源

posted @ 2018-04-14 15:07  ranjiewen  阅读(194)  评论(0编辑  收藏  举报