1. 首页
  2. 剑指offer经典面试题

[剑指 Offer 第 2 版第 34 题] “二叉树中和为某一值的路径”做题记录

[剑指 Offer 第 2 版第 34 题] “二叉树中和为某一值的路径”做题记录

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

传送门:二叉树中和为某一值的路径牛客网 online judge 地址

输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。

从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

样例

给出二叉树如下所示,并给出num=22。 5 / \ 4 6 / / \ 12 13 6 / \ / \ 9 1 5 1 输出:[[5,4,12,1],[5,6,6,5]]

Python 代码:

  class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None

    class Solution(object):
        def findPath(self, root, sum):
            """
            :type root: TreeNode
            :type sum: int
            :rtype: List[List[int]]
            """
            res = []
            if root is None:
                return res
            self.__dfs(root, sum, [], res)
            return res

        def __dfs(self, node, residue, path, res):
            # 递归,就应该先写递归终止条件
            if node is None:
                return
            # 走到这里 node 肯定非空,所以可以使用 left 和 right 成员变量
            # 走完以后,要记得回溯,状态要重置
            # 先把它加到路径中,在各种 if 都不成立的最后,要记得 pop 出去
            path.append(node.val)
            if node.left is None and node.right is None:
                # 如果是叶子结点,并且 residue 就等于当前结点的值
                if node.val == residue:
                    res.append(path[:])
                    # 注意:这里不要 return ,如果要 return,return 之前把 path 执行 pop 操作
            # 走到这里是非叶子结点,所以左边要走一走,右边也要走一走
            if node.left:
                self.__dfs(node.left, residue - node.val, path, res)
            if node.right:
                self.__dfs(node.right, residue - node.val, path, res)
            path.pop()

Java 代码:

  import java.util.ArrayList;
    import java.util.Stack;

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

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

        }
    }

    public class Solution {
        // 使用搜索的策略可以完成
        public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
            ArrayList<ArrayList<Integer>> res = new ArrayList<>();
            Stack<Integer> pre = new Stack<>();
            findPath(root, target, pre, res);
            return res;
        }

        private void findPath(TreeNode root, int target, Stack<Integer> pre, ArrayList<ArrayList<Integer>> res) {
            if (root == null || root.val > target) {
                return;
            }
            // 注意:题目中问的是到叶子结点
            if (root.val == target && root.left == null && root.right == null) {
                pre.add(root.val);
                res.add(new ArrayList<>(pre));
                pre.pop();
                return;
            }
            assert root.val < target && root != null;
            pre.add(root.val);
            findPath(root.left, target - root.val, pre, res);
            findPath(root.right, target - root.val, pre, res);
            pre.pop();
        }

        public static void main(String[] args) {
            TreeNode node1 = new TreeNode(1);
            TreeNode node2 = new TreeNode(2);
            TreeNode node3 = new TreeNode(3);
            TreeNode node4 = new TreeNode(4);
            TreeNode node8 = new TreeNode(8);
            TreeNode node7 = new TreeNode(7);

            node1.left = node2;
            node1.right = node3;

            node2.left = node4;
            node2.right = node8;

            node3.left = node7;

            Solution solution = new Solution();
            ArrayList<ArrayList<Integer>> findPath = solution.FindPath(node1, 11);
            System.out.println(findPath);
        }
    }

参考资料:LeetCode 第 113题:路径总和 II

作者:liweiwei1419

来源:https://liweiwei1419.github.io/sword-for-offer/


JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

标题:[剑指 Offer 第 2 版第 34 题] “二叉树中和为某一值的路径”做题记录

链接:https://www.javajike.com/article/3281.html

« [剑指 Offer 第 2 版第 32 题] “从上往下打印二叉树”做题记录
[剑指 Offer 第 2 版第 35 题] “复杂链表的复制”做题记录»

相关推荐

QR code