力扣深度优先搜索练习题(二叉树的中序遍历、验证二叉搜索树)

99 阅读2分钟

二叉树的中序遍历

来源:力扣(LeetCode) 链接:leetcode.cn/problems/bi…

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

图片.png

输入: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); // 遍历右子树
    }
}

思路分析

  1. 创建一个空的结果列表 result,用于存储遍历结果。
  2. 调用辅助函数 inorder 进行中序遍历,传入根节点 root 和结果列表 result
  3. 在辅助函数中,首先判断当前节点是否为空,如果为空则返回。
  4. 递归调用 inorder 函数,先遍历左子树,然后将当前节点的值加入结果列表,最后遍历右子树。
  5. 返回结果列表 result

验证二叉搜索树

来源:力扣(LeetCode) 链接:leetcode.cn/problems/va…

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

图片.png

输入:root = [2,1,3]

输出:true

示例 2:

图片.png

输入: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);
    }
}

思路分析

  1. 创建一个辅助函数 isValidBST,传入当前节点 node,以及该节点允许的最小值 min 和最大值 max
  2. 如果当前节点为 null,说明当前子树是一棵有效的 BST,返回 true。
  3. 如果节点的值小于等于最小值 min,或者大于等于最大值 max,则当前子树不是一棵有效的 BST,返回 false。
  4. 递归调用 isValidBST 函数,分别传入当前节点的左子节点和允许的最小值 min(左子树的最小值不变,右子树的最小值更新为当前节点的值),以及当前节点的右子节点和允许的最大值 max(右子树的最大值不变,左子树的最大值更新为当前节点的值)。
  5. 如果左子树和右子树都是有效的 BST,则整棵树是一棵有效的 BST,返回 true;否则返回 false。