problem:
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.
题意:判断一颗二叉树是否为搜索二叉树,注意搜索二叉树的性质:左子树的所有节点小于父节点,
右子树的所有节点大于父节点
右子树的所有节点大于父节点
thinking:
(1)开始试着用递归写了一个程序,对搜索二叉树的定义曲解了。仅仅比较了左孩子和右孩子。是错的。
class Solution {
public:
bool isValidBST(TreeNode *root) {
if(root==NULL)
return true;
TreeNode *parent = root;
TreeNode *left_child=parent->left;
TreeNode *right_child=parent->right;
bool r=true;
bool l=true;
if(left_child!=NULL)
{
if(left_child->val<parent->val)
l=isValidBST(left_child);
else
l=false;
}
if(right_child!=NULL)
{
if(right_child->val>parent->val)
r=isValidBST(right_child);
else
r=false;
}
return l&&r;
}
};
(2)正确解法是:中序遍历。采用DFS(非递归法)中序遍历二叉树,节点的VAL 应该是一个递增序列。
code:
class Solution {
public:
bool isValidBST(TreeNode *root)
{
vector<int> ret=inorderTraversal(root);
int n=ret.size();
if(n<2)
return true;
for(int i=1;i<n;i++)
{
if(ret[i]<=ret[i-1])
return false;
}
return true;
}
protected:
vector<int> inorderTraversal(TreeNode *root) {
vector<int> ret;
stack<TreeNode*> _stack;
TreeNode *tmp=root;
while(tmp!=NULL || !_stack.empty())
{
if(tmp!=NULL)
{
_stack.push(tmp);
tmp=tmp->left;
}
else
{
tmp=_stack.top();
_stack.pop();
ret.push_back(tmp->val);
tmp=tmp->right;
}
}
return ret;
}
};