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

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

目录

  • 题目大意
  • 一、示意图
  • 二、解题思路
    • DFS


题目大意

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

一、示意图

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

二、解题思路

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 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)
        //这里还有个细节是 必须要到根节点
        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);
    }
}

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

你可能感兴趣的:(LeetCode,数据结构,java)