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.
主要的思路:
1、左子树和右边子树是二叉搜索树,根节点大于左子树的最大值,根节点小于左子树的最小值
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
bool checkLeftSubTree(TreeNode *root)
{
if(root->left == NULL)
return true;
else{
int maxValue;
TreeNode *node = root->left;
while(node->right != NULL)
{
node = node->right;
}
maxValue = node->val;
if(root->val > maxValue)
return true;
else
return false;
}
}
bool checkRightSubTree(TreeNode *root)
{
if(root->right == NULL)
return true;
else{
int minValue;
TreeNode *node = root->right;
while(node->left != NULL)
{
node = node->left;
}
minValue = node->val;
if(root->val < minValue)
return true;
else{
return false;
}
}
}
bool isValidBST(TreeNode *root) {
if(root == NULL)
return true;
if(checkLeftSubTree(root)&&checkRightSubTree(root)&&isValidBST(root->left) && isValidBST(root->right))
{
return true;
}
}
char treeNodes[] = {1,1};
TreeNode *constructIterative(char *treeNodes,int len,int pos)
{
if(pos >= len || treeNodes[pos] == '#')
return NULL;
TreeNode *tn = (TreeNode *)malloc(sizeof(TreeNode));
tn->val = treeNodes[pos];
tn->left = constructIterative(treeNodes,len,2*pos+1);
tn->right = constructIterative(treeNodes,len,2*pos+2);
return tn;
}
int main(void)
{
TreeNode *root;
root = constructIterative(treeNodes,sizeof(treeNodes)/sizeof(char),0);
cout << isValidBST(root) << endl;
system("pause");
return 0;
}