java 剑指offer之[数据结构 困难]JZ24 二叉树中和为某一值的路径

LeetCode 专栏收录该内容
320 篇文章 2 订阅

题目的链接在这里:https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca


题目大意

输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 如二叉树root为{10,5,12,4,7},expectNumber为22

一、示意图

在这里插入图片描述

二、解题思路

dfs

DFS

代码如下:

import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int expectNumber) {
        //需要DFS 把每一条边都进行判断
       // Stack<TreeNode> stack=new Stack<>();
        ArrayList<ArrayList<Integer>> res=new ArrayList<>();
        ArrayList<Integer> arrayList=new ArrayList<>();
        ArrayList<Integer> arrayList1=new ArrayList<>();
        //不能排除负数
        if(root==null)
            return res;
        //然后依次进行判断
        //还有一些边界判断
        if(root.val==expectNumber){
            arrayList.add(root.val);
            res.add(arrayList);
            return res;
        }
        int num=root.val;
        arrayList.add(root.val);
        arrayList1.add(root.val);
       // stack.add(root);
        //然后进行判断
        if(root.left!=null){
            //对左子树进行dfs
            dfs(root.left,expectNumber,arrayList,num,res);
        }
        //这里可能存在覆盖的问题
        if(root.right!=null){
            dfs(root.right,expectNumber,arrayList1,num,res);
        }
        return res;
    }
    //dfs回退的覆盖问题
    private void dfs(TreeNode root, int expectNumber,  ArrayList<Integer> arrayList, int num, ArrayList<ArrayList<Integer>> res) {
        if(root==null)
            return;
        //然后先进行判断
        //要先进行更新 这些if是需要判断的
    /*    if(num==expectNumber&&(root.left==null)&&(root.right==null)){
            //说明满足条件了
            res.add(arrayList);
            //结束遍历
            return;
        }*/
        //不然的话 也是需要遍历的
        //先判断会不会超出范围 expectNumber-num是还差的值
        //有负数就离谱
      /*  if((expectNumber-num)<root.val){
            //这个说明 当前的值都大于期待的值了 那就不能再进行判断了
            return;
        }*/
        //这里还有个细节是 必须要到根节点
        if((expectNumber-num)==root.val&&(root.left==null)&&(root.right==null)){
            //刚好相等的话 那就直接开始返回
            arrayList.add(root.val);
            res.add(arrayList);
            return;
        }
      /*  //然后就是 小于 并且如果他没有子树的话 直接返回错误
        if(root.left==null&&root.right==null) {
            //关键是这边的回退
            return;
        }*/
        //不然的话 就放进去 然后进行更新
        num+=root.val;
        arrayList.add(root.val);
        //是不是还需要再加一个判断
        //然后进行判断
        //这里就不判断了
      /*  if(root.left!=null){
            //那就递归他的左子树
            dfs(root.left,expectNumber,arrayList,num,res);
        }
        //然后右子树不空的话
        if(root.right!=null){
            dfs(root.right,expectNumber,arrayList1,num,res);
        }*/
        dfs(root.left,expectNumber,new ArrayList<>(arrayList),num,res);
        dfs(root.right,expectNumber,new ArrayList<>(arrayList),num,res);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值