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 3Binary tree
[2,1,3]
, return true.
Example 2:
1 / \ 2 3Binary tree
[1,2,3]
, return false.
解题方法:
1.首先要知道什么是二叉搜索树,二叉搜索树的每一个节点的左子树中的所有元素都必须比他小,每一个节点的右子树中的所有元素都必须比他大。
2.这里我构造了两个遍历函数,一个用于遍历左子树,并判断左子树的元素是否小于父节点,若大于则不是二叉搜索树。一个用于遍历右子树,并判断右子树的元素是否大于父节点,若小于则不是二叉搜索树。
3.要注意的是当左子树不为空时,不仅要对左子树的两个儿子进行第一种遍历,判断它们是否小于根节点元素。还要对左子树左右儿子分别进行第一种遍历和第二种遍历,判断它们是否大于或小于左子树的值。同理当右子树不为空时,不仅要对右子树的儿子进行第二种遍历,判断他们是否小于根节点元素。还要对右子树左右儿子分别进行第一种遍历和第二种遍历,判断它们是否大于或小于右子树的值。
代码详情:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
if (root == NULL) {
return true;
} else {
int flag = 0;
int number = root->val;
if (root->left != NULL) {
pre(root->left, flag, number);
}
if (root->right != NULL) {
pre1(root->right, flag, number);
}
if (flag == 0) {
return true;
} else {
return false;
}
}
}
void pre(TreeNode* root, int& flag, int number) {
if (root != NULL) {
if (root->val >= number) {
flag = 1;
} else {
int number_ = root->val;
pre(root->left, flag, number_);
pre(root->right, flag, number);
pre1(root->right, flag, number_);
}
}
}
void pre1(TreeNode* root, int& flag, int number) {
if (root != NULL) {
if (root->val <= number) {
flag = 1;
} else {
pre1(root->left, flag, number);
int number_ = root->val;
pre(root->left, flag, number_);
pre1(root->right, flag, number_);
}
}
}
};
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
if (root == NULL) {
return true;
} else {
int flag = 0;
int number = root->val;
if (root->left != NULL) {
pre(root->left, flag, number);
}
if (root->right != NULL) {
pre1(root->right, flag, number);
}
if (flag == 0) {
return true;
} else {
return false;
}
}
}
void pre(TreeNode* root, int& flag, int number) {
if (root != NULL) {
if (root->val >= number) {
flag = 1;
} else {
int number_ = root->val;
pre(root->left, flag, number_);
pre(root->right, flag, number);
pre1(root->right, flag, number_);
}
}
}
void pre1(TreeNode* root, int& flag, int number) {
if (root != NULL) {
if (root->val <= number) {
flag = 1;
} else {
pre1(root->left, flag, number);
int number_ = root->val;
pre(root->left, flag, number_);
pre1(root->right, flag, number_);
}
}
}
};