二叉树dfs遍历。。。

二叉树中和为某一值的路径

http://www.nowcoder.com/questionTerminal/b736e784e3e34731af99065031301bca

题目是要找一条从根节点出发,到叶子节点的路径,且这个路径上节点的和要等于某个值。
典型的dfs遍历二叉树,遍历的时候用一个链表记录前面的路径,每次递归的时候传入还剩多少数值没有加。全局有一个ArrayList<ArrayList<Integer>> finalResult 用来存结果。

每一轮递归,都要先判断还剩下没加的数是否小于当前节点的数值,如果小于,就直接返回,说明当前节点往后的加起来都会比指定数值要大。
然后将当前节点的数值加到路径的末尾,
如果剩下没加的数字比当前节点的数字大,那么进入下一轮的递归。递归之前先判断左右孩子是否为空。下一轮递归要把剩下没加的数字减去当前节点的数值。
如果剩下没加的数字和当前节点的数字一样大,那么就把当前结果保存到finalResult中。
最后将当前节点的数值从路径末尾去掉。

import java.util.LinkedList;
import java.util.Arrays;

public class Solution {
    public ArrayList<ArrayList<Integer>> finalResult = new ArrayList<>();

    public void dfs(TreeNode root, LinkedList<Integer> list, int lsum){

        int nodeNum = root.val;
        if(lsum<nodeNum){
            return;
        }
        list.add(nodeNum);
        if(lsum>nodeNum){
            if(root.left!=null){
                dfs(root.left, list, lsum-nodeNum);
            }
            if(root.right!=null){
                dfs(root.right, list, lsum-nodeNum);
            }
        }else if(lsum==nodeNum&&root.left==null&&root.right==null){
            ArrayList<Integer> result = new ArrayList<>(list);
            finalResult.add(result);
        }
        list.removeLast();

    }

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        if(root==null){
            return finalResult;
        }
        LinkedList<Integer> list = new LinkedList<>();
        dfs(root, list, target);
        return finalResult;
    }
}
全部评论

相关推荐

07-17 12:07
门头沟学院 Java
勇敢牛牛不怕困难
投递OPPO等公司7个岗位
点赞 评论 收藏
分享
绝迹的星:前端和后端写两份简历, 如果想干全栈就直接写求职意向为全栈工程师
点赞 评论 收藏
分享
点赞 评论 收藏
分享
求offer的大角牛:简历写的第一乱,没有突出重点,第二项目太多太杂看不出来有啥核心技术,第三自我评价太多了,第四获得的荣誉没啥含金量,可以不写,反正问题不少
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务