美文网首页
【leetcode】No.113:path-sum-Ⅱ

【leetcode】No.113:path-sum-Ⅱ

作者: I讨厌鬼I | 来源:发表于2019-07-27 19:32 被阅读0次

题目描述

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
For example:
Given the below binary tree andsum = 22,

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

return

[
   [5,4,11,2],
   [5,8,4,5]
]

思路

在遍历二叉树的时候就将节点的值放入列表中,并计算权值之和,到叶子节点与sum比较,如果相等,就把列表放入结果列表中。递归非递归都可以,注意非递归需要用后序非递归改写,只有右子树为空或者已经遍历过才能把右子节点从列表中拿出来。

代码

递归实现
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;

public class Solution {
    ArrayList<ArrayList<Integer>> res;
    ArrayList<Integer> tmp;

    public ArrayList<ArrayList<Integer>> pathSum(TreeNode root, int sum) {
        res = new ArrayList();
        tmp = new ArrayList();
        preOrder(root, sum);
        return res;
    }

    private void preOrder(TreeNode root, int sum){
        if (root != null){
            sum -= root.val;
            tmp.add(root.val);
            //和为sum时把列表放入结果列表中
            if (root.left == null && root.right == null && sum == 0){
                res.add(new ArrayList<>(tmp));
            }
            else {
                preOrder(root.left, sum);
                preOrder(root.right, sum);
            }
            //遍历结束从列表中把该节点值拿出来
            tmp.remove(tmp.size() - 1);
        }
    }
}
非递归实现
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;
import java.util.Stack;

public class Solution {
    public ArrayList<ArrayList<Integer>> pathSum(TreeNode root, int sum) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        ArrayList<Integer> tmp = new ArrayList<>();
        Stack<TreeNode> stack = new Stack();
        TreeNode last = null;  //用于存储右节点是否被遍历过
        TreeNode cur = root;
        int count = 0;
        while (!stack.isEmpty() || cur != null){
            if (cur != null){
                count += cur.val;
                tmp.add(cur.val);
                //和为sum时把列表放入结果列表中
                if (count == sum && cur.left == null && cur.right == null){
                    res.add(new ArrayList(tmp));
                }
                stack.push(cur);
                cur = cur.left;
            }
            else {
                cur = stack.peek();
                //如果没有遍历过则往右子树遍历
                if (cur.right != null && last != cur.right){
                    cur = cur.right;
                }
                else {
                    cur = stack.pop();
                    //遍历过则从列表中拿出节点值,并把计算的总值减去
                    tmp.remove(tmp.size() - 1);
                    count -= cur.val;
                    //标记上一个节点
                    last = cur;
                    cur = null;
                }
            }
        }
        return res;
    }
}

相关文章

  • 【leetcode】No.113:path-sum-Ⅱ

    题目描述 Given a binary tree and a sum, find all root-to-leaf...

  • 112 Path Sum

    title: Path Sumtags:- path-sum- No.112- simple- tree- rec...

  • 「No.113」

    今天读《一切镜》,作者说,她与一位朋友在微信里聊艺术、阅读、诗歌、学习,互相推荐书籍。 我也希望自己可以拥有一个可...

  • 革命路上的故事

    【输出时间】2021.8.7 NO.113 【输出者】限量版楠瓜 【输出文】《孙中山》 【字数】819 【正文】 ...

  • 0818 No.113

    原句:阳光依然灿烂,蓝天依然湛蓝。可是我们已经不再憧憬那灰姑娘变成公主的童话。只是多了一个爱发呆的习惯。 仿句:院...

  • 读书分享

    合肥趁早阅读分享No.113 【分享者】Grace 【书名】《我们就是世界》 Pano,中国新生代摄影师、设计师,...

  • 布丁的未来(No.113)

    to born or not to born, it is a question.这个问题,只有果冻妈有发言权 过...

  • 【No.113】真正的强者

    不知道为什么,我觉得现在的社会真的有一些变态。 每个人活得都不像自己。 有多少人是在社会的大转盘下不断地被push...

  • NO.113:写给老师的话

    语文老师: 一中四月芳芸芸,不及佳人一袭裙。素手执笔,写尽百态;点绛朱唇,笑谈古今,筠心而松性,金采而玉相。...

  • 孩子的“自卑感”,可能源于妈妈

    365日更NO.113 在孩子的成长之中,最离不开的人是谁呢?对于大多数孩子来说,可能是妈妈。爸爸负责挣钱养...

网友评论

      本文标题:【leetcode】No.113:path-sum-Ⅱ

      本文链接:https://www.haomeiwen.com/subject/xgzerctx.html