二叉树中和为某一值的路
二叉树中和为某一值的路径
http://www.nowcoder.com/questionTerminal/b736e784e3e34731af99065031301bca
- 题目描述: 二叉树中和为某一值的路
- 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
- 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- (注意: 在返回值的list中,数组长度大的数组靠前)
- 题解如下:
-
本题需要遍历每个路径,首先考虑深度优先搜索
-
使用栈避免递归,每次到达叶子节点进行判断该路径的和是否为target
-
最后需要考虑排序,即按list长度降序排序
-
代码如下
-
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Stack; public class Soultion { class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } class Com implements Comparator> { @Override public int compare(ArrayList o1, ArrayList o2) { // TODO Auto-generated method stub return -1 * (o1.size() - o2.size());//降序排序 } } private void def(TreeNode root, int target, ArrayList> res, ArrayList cur) { if(root == null) return ; Stack stack = new Stack(); stack.push(root); int sum = 0; while(!stack.isEmpty()) { TreeNode node = stack.pop(); sum += node.val; cur.add(node.val); //判断路径的和是否为target,到达叶子节点无论和是否为target,都需要将叶子节点的值减去并且将该节点从路径cur中去掉 if(sum == target && node.left == null && node.right == null) { sum -= node.val; res.add(new ArrayList(cur)); cur.remove(cur.size() - 1); } else if(sum != target && node.left == null && node.right == null) { sum -= node.val; cur.remove(cur.size() - 1); } if(node.left != null) { stack.push(node.left); } if(node.right != null) { stack.push(node.right); } } } public ArrayList> FindPath(TreeNode root,int target) { ArrayList> res = new ArrayList(); ArrayList cur = new ArrayList(); if(root == null) return res; def(root, target, res, cur); Collections.sort(res, new Com()); return res; } }
查看19道真题和解析