题目
给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。
二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。
例:
图1
图2
数据范围:节点数量满足 1≤n≤10^4,节点上的值满足 −2^31 ≤ val≤ 2^31 − 1
示例1
输入:{1,2,3}
返回值:false
示例2
输入:{2,1,3}
返回值:true
思路1:递归
代码1
import java.util.*;
public class Solution {
int pre = Integer.MIN_VALUE;
public boolean isValidBST (TreeNode root) {
if(root == null) {
return true;
}
//递归的任务-中序递归遍历:左->根->右
if(!isValidBST(root.left)) {
return false;
}
if(root.val < pre) {
return false;
}
pre = root.val;
return isValidBST(root.right);
}
}
思路2:栈
- step 1:优先判断树是否为空,空树不遍历。
- step 2:准备一个数组记录中序遍历的结果。
- step 3:准备辅助栈,当二叉树节点为空了且栈中没有节点了,我们就停止访问。
- step 4:从根节点开始,每次优先进入每棵的子树的最左边一个节点,我们将其不断加入栈中,用来保存父问题。
- step 5:到达最左后,可以开始访问,如果它还有右节点,则将右边也加入栈中,之后右子树的访问也是优先到最左。
- step 6:遍历数组,依次比较相邻两个元素是否为递增序。
代码2
import java.util.*;
public class Solution {
public boolean isValidBST (TreeNode root) {
//设置栈用于遍历
Stack<TreeNode> s = new Stack<>();
TreeNode head = root;
//记录中序遍历的数组
ArrayList<Integer> sort = new ArrayList<>();
while(head != null || !s.isEmpty()) {
//直到没有左节点
while(head != null) {
s.push(head);
head = head.left;
}
head = s.pop();
//访问节点
sort.add(head.val);
//进入右边
head = head.right;
}
//遍历中序结果
for(int i = 1; i < sort.size(); i++) {
//一旦有降序,则不是搜索树
if(sort.get(i - 1) > sort.get(i)) {
return false;
}
}
return true;
}
}