如题
二叉搜索树相关概念
- 二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。
- 如果指向根节点的指针为null,则该树也为二叉搜索树
代码如下
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* @param root TreeNode类
* @return bool布尔型
*/
int pre = Integer.MIN_VALUE;
public boolean isValidBST (TreeNode root) {
if(root == null){
return true;
}else{
if(!isValidBST(root.left) || root.val < pre){
return false;
}
pre = root.val;
return isValidBST(root.right);
}
}
}
解题方法
类比二叉树的递归中序遍历:
// 中序遍历的递归函数
void inorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return; // 如果节点为空,直接返回
}
inorderTraversal(root->left); // 先遍历左子树
printf("%d ", root->val); // 再访问根节点
inorderTraversal(root->right); // 最后遍历右子树
}
- 由于二叉排序树的中序遍历得到的是一个严格递增的数组,所以对于每一个元素,它的前驱pre一定小于它,而初始化pre时就让它为第一个元素的前驱,为无穷小;
- 判断是否为二叉树的代码参考二叉树的中序遍历,先处理root为null时返回true;
- 接着处理左子树:判断左子树是否为二叉排序树,同时判断pre是否大于root.val(即左子树所以元素是否小于root.val)(注意:一定要像判断左子树是否为二叉排序树,因为在判断完之后pre的值会变为左子树最右边的值) 即: if(!isValidBST(root.left) || root.val < pre)
- 判断完左子树接着将pre赋值为root.val;
- 直接返回isValidBST(root.right);