二叉树的中序遍历
来源:力扣(LeetCode) 链接:leetcode.cn/problems/bi…
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
代码
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
inorder(root, result);
return result;
}
private void inorder(TreeNode node, List<Integer> result) {
if (node == null) {
return;
}
inorder(node.left, result); // 遍历左子树
result.add(node.val); // 访问当前节点
inorder(node.right, result); // 遍历右子树
}
}
思路分析
- 创建一个空的结果列表
result,用于存储遍历结果。 - 调用辅助函数
inorder进行中序遍历,传入根节点root和结果列表result。 - 在辅助函数中,首先判断当前节点是否为空,如果为空则返回。
- 递归调用
inorder函数,先遍历左子树,然后将当前节点的值加入结果列表,最后遍历右子树。 - 返回结果列表
result。
验证二叉搜索树
来源:力扣(LeetCode) 链接:leetcode.cn/problems/va…
给你一个二叉树的根节点 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
代码
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, null, null);
}
private boolean isValidBST(TreeNode node, Integer min, Integer max) {
if (node == null) {
return true;
}
if ((min != null && node.val <= min) || (max != null && node.val >= max)) {
return false;
}
return isValidBST(node.left, min, node.val) && isValidBST(node.right, node.val, max);
}
}
思路分析
- 创建一个辅助函数
isValidBST,传入当前节点node,以及该节点允许的最小值min和最大值max。 - 如果当前节点为 null,说明当前子树是一棵有效的 BST,返回 true。
- 如果节点的值小于等于最小值
min,或者大于等于最大值max,则当前子树不是一棵有效的 BST,返回 false。 - 递归调用
isValidBST函数,分别传入当前节点的左子节点和允许的最小值min(左子树的最小值不变,右子树的最小值更新为当前节点的值),以及当前节点的右子节点和允许的最大值max(右子树的最大值不变,左子树的最大值更新为当前节点的值)。 - 如果左子树和右子树都是有效的 BST,则整棵树是一棵有效的 BST,返回 true;否则返回 false。