剑指Offer--二叉树中和为某一值的路径
2015-10-18 23:20
453 查看
题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。Java代码
import java.util.ArrayList; import java.util.Iterator; import java.util.Stack; /** public 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>> lst = new ArrayList<ArrayList<Integer>>(); Stack<Integer> stack = new Stack<Integer>(); dfs(lst,root,stack,target); return lst; } public void dfs (ArrayList<ArrayList<Integer>> lst, TreeNode root, Stack<Integer> stack, int target){ if(root == null) return ; if(root.left == null && root.right == null){ if(target == root.val){ Iterator<Integer> iter = stack.iterator(); ArrayList<Integer> tmp = new ArrayList<Integer>(); while(iter.hasNext()){ tmp.add(iter.next()); } tmp.add(root.val); lst.add(tmp); } return ; } stack.push(root.val); dfs(lst,root.left,stack,target-root.val); dfs(lst,root.right,stack,target-root.val); stack.pop(); } }
测试代码
import java.util.ArrayList; import java.util.Iterator; import java.util.Stack; class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public class Main { public static void main(String[] args) { TreeNode root = new TreeNode(1); TreeNode node2 = new TreeNode(2); TreeNode node3 = new TreeNode(3); TreeNode node4 = new TreeNode(4); TreeNode node5 = new TreeNode(5); TreeNode node6 = new TreeNode(6); TreeNode node7 = new TreeNode(7); root.left = node2; root.right = node5; node2.left = node3; node2.right = node4; node5.left = node6; node5.right = node7; node3.left = null; node3.right = null; node4.left = null; node4.right = null; node6.left = null; node6.right = null; node7.left = null; node7.right = null; int target = 7; Main ma = new Main(); ArrayList<ArrayList<Integer>> lst = ma.FindPath(root, target); } public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target){ ArrayList<ArrayList<Integer>> lst = new ArrayList<ArrayList<Integer>>(); Stack<Integer> stack = new Stack<Integer>(); dfs(lst,root,stack,target); return lst; } public void dfs (ArrayList<ArrayList<Integer>> lst, TreeNode root, Stack<Integer> stack, int target){ if(root == null) return ; if(root.left == null && root.right == null){ if(target == root.val){ Iterator<Integer> iter = stack.iterator(); ArrayList<Integer> tmp = new ArrayList<Integer>(); while(iter.hasNext()){ tmp.add(iter.next()); } tmp.add(root.val); lst.add(tmp); } return ; } stack.push(root.val); dfs(lst,root.left,stack,target-root.val); dfs(lst,root.right,stack,target-root.val); stack.pop(); } }
算法思路
(1)采用深度优先算法,利用栈结构存储访问过的路径结点的值。(2)当访问到空节点时,直接return 。
(3)当访问到叶子结点时,判断走过的路径的值之和是否为target,如果是,则保存此路径,否则不处理。
(4)先访问左子树,后访问右子树。
(5)在访问完某个结点的左右子树时,需要将此结点的值出栈。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统