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

描述

输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从
树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

预备知识

前序遍历(递归 非递归)

Oj

https://leetcode-cn.com/problems/binary-tree-preorder-traversal/

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */


class Solution {

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList();
        //新建一个函数,为了保证list能不断加入数字
        pre(root, list);
        return list;

    }

    private void pre(TreeNode root, List list){
        //判空以及终止条件
        if (root == null) {
            return ;
        }
        list.add(root.val);
        //加判断更优雅,不加也可以,一种习惯
        if (root.left != null) {
            pre(root.left, list);
        }
        //加判断更优雅,不加也可以,一种习惯
        if (root.right != null) {
            pre(root.right, list);
        }       
    }
}

思路

1、从根节点开始遍历,说明他是前序遍历

2、到达叶节点不是目标值,要回退元素,其实是一个栈结构

3、树的问题大部分是递归问题

Oj

https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca?tpId=13&tqId=11177&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

代码

import java.util.ArrayList;

public class Solution {

    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

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

        }

    }
    /**
     *
     * @param root
     * @param target
     * @return
     * 1、从根节点开始遍历,说明他是前序遍历
     * 2、到达叶节点不是目标值,要回退元素,其实是一个栈结构
     * 3、树的问题大部分是递归问题
     */


    //将成员变量建在外部,递归的时候就不会新建变量的问题出现
    private ArrayList<Integer> list = new ArrayList<>();
    private ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        if (root == null){
            return lists;
        }
        list.add(root.val);
        target -= root.val;
        if (target == 0 && root.right == null && root.left == null){
            lists.add(new ArrayList<>(list));
        }
        FindPath(root.left, target);
        FindPath(root.right, target);
        //移除list中的元素,不是lists,因为lists中元素根据条件是永远符合的
        list.remove(list.size() - 1);
        return lists;
    }


}

版权声明:本文为chenzhuantou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/chenzhuantou/p/10250306.html