剑指 Offer 34. 二叉树中和为某一值的路径附完整可运行代码

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 34. 二叉树中和为某一值的路径附完整可运行代码相关的知识,希望对你有一定的参考价值。

立志用最少的代码做最高效的表达


输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 target = 22,

          5
         / \\
        4   8
       /   / \\
      11  13  4
     /  \\    / \\
    7    2  5   1

返回:
[
[5,4,11,2],
[5,8,4,5]
]

提示:
节点总数 <= 10000


解法:dfs
边界条件:当某节点是叶子结点,并且当前和等于target。

注意:
1、将容器设为成员变量,而不是把当做参数传递,后者效率很低。
2、对树的dfs中,无需设立vis数组,因为树是具有规律性的,只会从上到下,从左到右的搜索。
3、dfs剪枝时的语句:if(nowValue > Value) return; 不适用于节点值可能为负的情况。


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
        // 定义成员变量
        List<List<Integer>>list;
        int sum, tar;
        List<Integer>tmp;
        public List<List<Integer>> pathSum(TreeNode root, int target) {
            // 为成员变量赋值
            sum = 0; tar = target;
            tmp = new ArrayList<>();
            list = new ArrayList<>();

            if(root == null) return list;        // 鲁棒性
            tmp.add(root.val);          // 先加入根节点
            dfs(root.val, root);    // 先不加vis试一下
            return list;
        }
        public void dfs(int nowSum, TreeNode nowRoot) {
            // if(nowSum > tar) return;     // 剪枝 这个剪枝,只能用在节点是正的情况下
            // 遍历到了叶节点,且等于目标值,则该路径符合
            if((nowRoot.left==null && nowRoot.right == null) && nowSum == tar) {
                list.add(new ArrayList<>(tmp));
                return;
            }

            if(nowRoot.left != null) {
                tmp.add(nowRoot.left.val);
//                System.out.println(tmp.toString());
                dfs(nowSum + nowRoot.left.val, nowRoot.left);
                tmp.remove(tmp.size()-1);
            }
            if(nowRoot.right != null) {
                tmp.add(nowRoot.right.val);
//                System.out.println(tmp.toString());
                dfs(nowSum + nowRoot.right.val, nowRoot.right);
                tmp.remove(tmp.size()-1);
            }
        }
}

完整可运行代码

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class 剑指Offer34_二叉树中和为某一值的路径 {
    static class TreeNode {
        int val;
        TreeNode left, right;
        TreeNode(int v) { val = v; }
    }
    static class Solution {
        // 定义成员变量
        List<List<Integer>>list;
        int sum, tar;
        List<Integer>tmp;
        public List<List<Integer>> pathSum(TreeNode root, int target) {
            // 为成员变量赋值
            sum = 0; tar = target;
            tmp = new ArrayList<>();
            list = new ArrayList<>();

            if(root == null || target == 0) return list;        // 鲁棒性
            tmp.add(root.val);          // 先加入根节点
            dfs(root.val, root);    // 先不加vis试一下
            return list;
        }
        public void dfs(int nowSum, TreeNode nowRoot) {
            if(nowSum > tar) return;     // 剪枝
            // 遍历到了叶节点,且等于目标值,则该路径符合
            if((nowRoot.left==null && nowRoot.right == null) && nowSum == tar) {
                list.add(new ArrayList<>(tmp));
                return;
            }

            if(nowRoot.left != null) {
                tmp.add(nowRoot.left.val);
//                System.out.println(tmp.toString());
                dfs(nowSum + nowRoot.left.val, nowRoot.left);
                tmp.remove(tmp.size()-1);
            }
            if(nowRoot.right != null) {
                tmp.add(nowRoot.right.val);
//                System.out.println(tmp.toString());
                dfs(nowSum + nowRoot.right.val, nowRoot.right);
                tmp.remove(tmp.size()-1);
            }
        }
    }

    public static void main(String[] args) {
        // [10, 5, 12, 4, 7, null, null]
        TreeNode treeNode = new TreeNode(10);
        TreeNode tmp21 = new TreeNode(5), tmp22 = new TreeNode(12);
        TreeNode tmp31 = new TreeNode(4), tmp32 = new TreeNode(7);
        treeNode.left = tmp21; treeNode.right = tmp22;
        tmp21.left = tmp31; tmp21.right = tmp32;


        Solution solution = new Solution();
        List<List<Integer>> list = solution.pathSum(treeNode, 22);
        // toString打印数组中的值
        System.out.println(list.toString());
    }
}

以上是关于剑指 Offer 34. 二叉树中和为某一值的路径附完整可运行代码的主要内容,如果未能解决你的问题,请参考以下文章

Java 剑指offer(34) 二叉树中和为某一值的路径

剑指offer树34.二叉树中和为某一值的路径

剑指offer树34.二叉树中和为某一值的路径

剑指Offer34,二叉树中和为某一值的路径

刷题记录-剑指offer34:二叉树中和为某一值的路径

剑指Offer对答如流系列 - 二叉树中和为某一值的路径