题目描述:
题号:98
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
-
节点的左子树只包含 小于 当前节点的数。
-
节点的右子树只包含 大于 当前节点的数。
-
所有左子树和右子树自身必须也是二叉搜索树。
解题思路:
思路一:递归
递归规律:
如果该二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;
若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左右子树也为二叉搜索树。
时间复杂度:O(N)
空间复杂度:O(N)
C++
// C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
bool check(TreeNode* root, long long int leftSamller, long long int rightBigger) {
if(root == nullptr) {
return true;
}
if(root->val <= leftSamller || root->val >= rightBigger) {
return false;
}
return check(root->left, leftSamller, root->val) && check(root->right, root->val, rightBigger);
}
public:
bool isValidBST(TreeNode* root) {
return check(root, LONG_MIN, LONG_MAX);
}
};
go
// go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isValidBST(root *TreeNode) bool {
return check(root, math.MinInt64, math.MaxInt64)
}
func check(root *TreeNode, small, big int) bool {
if root == nil {
return true
}
if root.Val <= small || root.Val >= big {
return false
}
return check(root.Left, small, root.Val) && check(root.Right, root.Val, big)
}
思路二:中序遍历
根据二叉搜索树的性质:它的中序遍历的值一定是递增的
时间复杂度:O(N)
空间复杂度:O(N)
C++
// C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> stack;
long long int inorder = (long long int)INT_MIN - 1;
while (stack.empty() == false || root != nullptr) {
while (root != nullptr) {
stack.push(root);
root = root->left;
}
root = stack.top();
stack.pop();
// 如果中序遍历不是递增,则不是二叉搜索树
if (root->val <= inorder) {
return false;
}
inorder = root->val;
root = root->right;
}
return true;
}
};
go
// go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isValidBST(root *TreeNode) bool {
stack := []*TreeNode{}
inorder := math.MinInt64
for len(stack) > 0 || root != nil {
for root != nil {
stack = append(stack, root)
root = root.Left
}
root = stack[len(stack)-1]
stack = stack[:len(stack)-1]
// 如果中序遍历不是递增,则不是二叉搜索树
if root.Val <= inorder {
return false
}
inorder = root.Val
root = root.Right
}
return true
}
标签:right,TreeNode,val,力扣,二叉树,100,root,stack,left
From: https://blog.csdn.net/H_P10/article/details/142288751