LeetCode 有关树深度、路径的题目(JAVA代码实现)

本文详细探讨了LeetCode中涉及树的路径和深度的题目,包括路径总和、二叉树的最小深度、N叉树的最大深度等,并提供了JAVA代码实现。通过深度优先搜索策略解决路径问题,分析了时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

1. 路径相关的题目

112.路径总和

在这里插入图片描述
题目:判断是否存在从根节点到某一叶子节点的路径,路径上所有节点值之和为给定值
思路:利用深度优先算法

    public boolean hasPathSum(TreeNode root, int sum) {
   
        // 对题目的输入进行判断,若空则返回
        return root != null && hasPathSum1(root, sum);
    }

    /*
    * 两种情况:
    * ① 当前节点为叶子节点,且符合要求
    * ② 当前节点为内部节点,判断其孩子节点中是否有符合要求的题目
    * */
    private static boolean hasPathSum1(TreeNode root, int sum) {
   
        return (root.val == sum && root.left == null && root.right == null)
                || (root.left != null && hasPathSum1(root.left, sum - root.val))
                || (root.right != null && hasPathSum1(root.right, sum - root.val));
    }

    // 下面有另一种书写方式:
    public boolean hasPathSum(TreeNode root, int sum) {
   
        // 是否为空
        if (root == null) return false;
        // 叶子节点是否为空
        if (root.left == null && root.right == null && sum - root.val == 0) return true;
        // 判断左右节点中是否有满足的情况
        return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
    }

复杂度:

  • 时间复杂度:O(n),为最糟糕的情况,即遍历了所有节点,但没有一个路径符合
  • 空间复杂度:O(log(n)),为树的高度,最多有几个节点被压入栈中

113.路径总和 II

在这里插入图片描述
题目:类似于上一道题,但这里要求是输出所有符合要求的路径
思路:依旧是深度优先遍历,但要遍历完所有路径,相同的思路两种代码的写法:

	// 写法一:
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
   
        List<List<Integer>> lists = new ArrayList<>();
        if (root == null) return lists;
        pathSum(root, sum, lists, new ArrayList<>());
        return lists;
    }

    private void pathSum(TreeNode root, int sum, List<List<Integer>> lists, List<Integer> list){
   
        if (root == null) {
   
            return;
        }
        list.add(root.val);
        // 判断为从 root-to-leaves 的串,则判断是否符合题意
        if (root.val == sum && root.left == null && root.right == null) {
   
            lists.add(new ArrayList<>(list));
        } else {
   
            // 当前节点为中间节点,则继续往下查看其左右节点
            pathSum(root.left, sum - root.val, lists, list);
            pathSum(root.right, sum - root.val, lists, list);
        }
        // 完成这个节点的遍历返回父节点时,要删除当前节点的值
        list.remove(list.size() - 1);
    }

	// 写法二:
	public List<List<Integer>> pathSum(TreeNode root, int sum) {
   
        List<List<Integer>> lists = new ArrayList<>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值