98. Validate Binary Search Tree

Posted 小河沟大河沟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
	}
};

题目来源

以上是关于98. Validate Binary Search Tree的主要内容,如果未能解决你的问题,请参考以下文章

98. Validate Binary Search Tree

LC.98.Validate Binary Search Tree

LeetCode98. Validate Binary Search Tree

98. Validate Binary Search Tree

98. Validate Binary Search Tree

98. Validate Binary Search Tree