来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
著作权归领扣网络所有。
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
递归比较左右子树
c 语言 8 ms 8.4 MB
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool dfs(struct TreeNode* root, long long int min, long long int max) {
if (root == NULL) {
return true;
}
if ( root->val <= min || root->val >= max ) {
return false;
}
return dfs(root->left, min, root->val) && dfs(root->right, root->val, max);
}
bool isValidBST(struct TreeNode* root){
return dfs(root, LONG_MIN, LONG_MAX);
}
PHP 12 ms 18 MB
/**
* Definition for a binary tree node.
* class TreeNode {
* public $val = null;
* public $left = null;
* public $right = null;
* function __construct($value) { $this->val = $value; }
* }
*/
class Solution {
/**
* @param TreeNode $root
* @return Boolean
*/
function isValidBST($root) {
return $this->helper($root, -(1<<32), 1<<32);
}
function helper($root, $min, $max) {
if ($root == null) {
return true;
}
if ($root->val <= $min || $root->val >= $max ) {
return false;
}
return $this->helper($root->left, $min, $root->val) && $this->helper($root->right, $root->val, $max);
}
}
中序遍历
递归中序遍历
PHP 16 ms 18.1 MB
/**
* Definition for a binary tree node.
* class TreeNode {
* public $val = null;
* public $left = null;
* public $right = null;
* function __construct($value) { $this->val = $value; }
* }
*/
class Solution {
/**
* @param TreeNode $root
* @return Boolean
*/
function isValidBST($root) {
$res = [];
$this->helper($root, $res);
for ($i = 1; $i < count($res); $i++) {
if ($res[$i] <= $res[$i-1]) {
return false;
}
}
return true;
}
function helper($root, &$res) {
if ($root) {
$this->helper($root->left, $res);
$res[] = $root->val;
$this->helper($root->right, $res);
}
}
}
非递归中序遍历
PHP 16 ms 17.8 MB
/**
* Definition for a binary tree node.
* class TreeNode {
* public $val = null;
* public $left = null;
* public $right = null;
* function __construct($value) { $this->val = $value; }
* }
*/
class Solution {
/**
* @param TreeNode $root
* @return Boolean
*/
function isValidBST($root) {
$prev = -(1<<32);
$stack = [];
$top = 0;
while ( $top || $root ) {
while ($root) { //优先遍历左子树
$stack[$top++] = $root;
$root = $root->left;
}
$root = $stack[--$top]; //出栈
if ( $root->val <= $prev ) { //中序比较
return false;
}
$prev = $root->val; //赋值前一个
$root = $root->right; //遍历右子树
}
return true;
}
}