“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
98. 验证二叉搜索树
一、题目描述:
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入: root = [2,1,3]
输出: true
示例 2:
输入: root = [5,1,4,null,null,3,6]
输出: false
解释: 根节点的值是 5 ,但是右子节点的值是 4 。
提示:
- 树中节点数目范围在
[1, 104]内 -231 <= Node.val <= 231 - 1
二、思路分析:
- 二叉搜索树的特点, 左子树比根节点小, 右子树比根节点大
二叉搜索树的中序遍历一定时递增的
三、AC 代码:
class Solution {
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
long pre = Long.MIN_VALUE;
while(root != null || !stack.isEmpty()){
while(root != null){
stack.push(root);
root = root.left;
}
TreeNode node = stack.pop();
if(node.val <= pre){
return false;
}
pre = node.val;
if(node.right != null){
root = node.right;
}
}
return true;
}
}
101. 对称二叉树
一、题目描述:
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
输入: root = [1,2,2,3,4,4,3]
输出: true
示例 2:
输入: root = [1,2,2,null,3,null,3]
输出: false
提示:
- 树中节点数目在范围
[1, 1000]内 -100 <= Node.val <= 100
进阶: 你可以运用递归和迭代两种方法解决这个问题吗?
二、思路分析:
- 递归 考虑左子树与右子树是否是对称的,
- 左右子树根节点的值
- 子树是否对称
三、AC 代码:
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return check(root.left, root.right);
}
boolean check(TreeNode left, TreeNode right) {
if (left == null && right == null) return true;
if (left == null || right == null) return false;
return left.val == right.val &&
check(left.right, right.left)
&& check(left.left, right.right);
}
}