打印二叉树节点数值总和等于某个给定节点的所有路径

打印二叉树节点数值总和等于某个给定节点的所有路径,路径可以从任意节点开始,任意节点结束。

比如,假设和是8,树如下 的路径有  [[5,3],[8],[5,1,2]]。

    5

   / \

3     1

/\     /\

4  8  2   6

思路:遍历所有路径,对于每一个节点,在其路径中向后寻找sum和为target的路径加入到结果中。

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

private void find(List<List<Integer>> res, List<Integer> tmp, TreeNode root, int sum){
    if(root==null)
        return;
    tmp.add(root.val);

    //for each node
    int tmpSum=0;
    for(int i=tmp.size()-1;i>=0;i--){
        tmpSum+=tmp.get(i);
        if(tmpSum==sum){
            res.add(i,tmp);
        }

    }    

    find(res,tmp,root.left,sum);
    find(res,tmp,root.right,sum);
    tmp.remove(tmp.size()-1);

}
时间: 2024-10-26 01:39:58

打印二叉树节点数值总和等于某个给定节点的所有路径的相关文章

左神算法书籍《程序员代码面试指南》——3_02打印二叉树的边界节点【★★】

[题目]给定一棵二叉树的头节点head,按照如下两种标准分别实现二叉树边界节点的逆时针打印.标准一:1.头节点为边界节点.2.叶节点为边界节点.3.如果节点在其所在的层中是最左或最右的,那么也是边界革点.标准二:1.头节点为边界节点.2.叶节点为边界节点.3.树左边界延伸下去的路径为边界节点.4.树右边界延伸下去的路径为边界节点.例如,如图3 - 2所示的树. 按标准一的打印结果为:1,2,4,7,11,13,14,15,16,12,10,6,3按标准二的打印结果为:1,2,4,7,13,14,

Python实现打印二叉树某一层的所有节点

不多说,直接贴程序,如下所示 # -*- coding: utf-8 -*- # 定义二叉树节点类 class TreeNode(object): def __init__(self,data=0,left=0,right=0): self.data = data self.left = left self.right = right # 遍历某一层所有节点,并打印 def TransLevel(root,level): if root == None: return else: if leve

按层换行打印二叉树

题目描述:  二叉树,按层打印,并且每层换行 分析:  我们知道,二叉树的层序遍历需要借助队列来实现,每取出一个节点打印,并将该节点的左右孩子放入队列中,依此反复,直到队列为空时,也就完成了二叉树的按层打印. 基本过程如图所示: 但是,关键是怎么换行? 分析:要换行则需要知道什么时候换行,由二叉树我们可以分析,我们需要知道每一层最右边的节点,每次打印完这个节点的值后,再打印一个换行即可.于是我们这样做: 定义两个变量,last 和 nlast last : 表示正在打印的当前行的最右节点 nla

二叉树(8)----第一个二叉树K层节点和二进制部分K叶节点层,递归和非递归

1.二进制定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树第K层的节点数 (1)递归方式: 给定根节点pRoot:

3.3 如何较为直观地打印二叉树

[题目]: 二叉树可以用常规的三种遍历结果来描述其结构,但是不够直观,尤其是二叉树中有重复值的时候,仅通过三种遍历的结果来构造二叉树的真实结构更是难上加难,有时则根本不可能.给定一棵二叉树的头节点head,已知二叉树节点值的类型为32位整型,请实现一个打印二叉树的函数,可以直观地展示树的形状,也便于画出真实的结构. 原文地址:https://www.cnblogs.com/latup/p/9921995.html

从上往下打印二叉树(分层遍历)

从上往下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 从上到下打印二叉树的规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾.接下来到队列的头部取出最早进入队列的节点,重复前面的打印操作,直到队列中所有的节点都被打印出来为止. struct TreeNode { int val; TreeNode* left; TreeNode* right; }; void LevelOrder(BinaryTreeNode* root) { if (roo

剑指Offer面试题23(Java版):从上往下打印二叉树

题目:从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入下图的二叉树,则一次打印出8,6,10,5,7,9,11. 这道题实质上考察的就是树的遍历算法,只是这种遍历不是我们熟悉的前序.中序或者后序遍历.由于我们不太熟悉这种按层遍历的方法,可能已下载也想不清楚遍历的过程. 因为按层打印的顺序决定应该先打印的根节点,所以我们从树的根节点开始分析.为了接下来能够打印8的结点的两个子节点,我们应该在遍历到该结点时把值为6和10的两个结点保存到一个容器中,现在容器内就有两个结点了.

剑指OFFER之从上往下打印二叉树(九度OJ1523)

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩

算法笔记_189:历届试题 横向打印二叉树(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放入那个位置. 比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白. ...|-1210-|...|-8-|.......|...|-7.......|-5-|...........|-4 本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横