一.题目
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.
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
Show Tags
Have you met this question in a real interview?
Yes
No
二.解题技巧
这道题是判断一个二叉查找树是否合法的,这个可以根据二叉查找树的定义来进行判断,即一个内部结点的值要大于左子树的最大值,同时要小于右子树的最大值,根据这个定义,就可以递归得进行判断了,这种方法得时间复杂度为O(n),空间复杂度为O(logn)。这道题要注意的地方就是要记得更新以结点为父节点的树的最大值和最小值,以便递归返回时给上一个调用进行判断。
三.实现代码
#include <iostream>
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution
{
private:
bool isValidBST(TreeNode* root, int &MinValue, int &MaxValue)
{
if (!root)
{
return true;
}
if (root->left)
{
if (root->val <= root->left->val)
{
return false;
}
int LeftMinValue = 0;
int LeftMaxValue = 0;
if (!isValidBST(root->left, LeftMinValue, LeftMaxValue))
{
return false;
}
else
{
MinValue = LeftMinValue;
if (LeftMaxValue != LeftMinValue)
{
if (root->val <= LeftMaxValue)
{
return false;
}
}
}
}
else
{
MinValue = root->val;
}
if (root->right)
{
if (root->val >= root->right->val)
{
return false;
}
int RightMinValue = 0;
int RightMaxValue = 0;
if (!isValidBST(root->right, RightMinValue, RightMaxValue))
{
return false;
}
else
{
MaxValue = RightMaxValue;
if (RightMaxValue != RightMinValue)
{
if (root->val >= RightMinValue)
{
return false;
}
}
}
}
else
{
MaxValue = root->val;
}
return true;
}
public:
bool isValidBST(TreeNode* root)
{
int MinValue = 0;
int MaxValue = 0;
bool IsLeaf = true;
return isValidBST(root, MinValue, MaxValue);
}
};
四.体会
这道题主要还是二叉查找树的遍历,同时,要将子树的最大值和最小值返回,以便判读结点的值是否合法,同时要记得更新以该结点为父结点的子树的最大值和最小值,以便递归返回时给上一个调用进行判断。这道题并不难,只要注意细节即可。
版权所有,欢迎转载,转载请注明出处,谢谢
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)