25 二叉树中和为某一值的路径
2016-07-17 11:25
211 查看
描述:
代码:
package question25;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class PathInPeek {
ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list=new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
int currentSum=0;
recurisve(root,target,currentSum);
return result;
}
private void recurisve(TreeNode root,int target,int currentSum) {
currentSum+=root.val;
list.add(root.val);
boolean isLeaf=root.left==null&&root.right==null;
if (currentSum==target&&isLeaf) {
result.add(new ArrayList<Integer>(list)); //注意:此处不能 是 result.add(list) ,因为list 只是一个指针,list的内容 会变。
}
if (currentSum<target&&root.left!=null) {
recurisve(root.left, target, currentSum);
}
if (currentSum<target&&root.right!=null ) {
recurisve(root.right, target, currentSum);
}
list.remove(list.size()-1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
System.out.println("请输入树 的先序遍历:");
TreeNode root=creatTree(in);
System.out.println("下面是树 的先序遍历:");
display(root);
System.out.println();
PathInPeek ly=new PathInPeek();
ly.FindPath(root, 22);
System.out.println("以下是所有路径");
System.out.println(ly.result);
}
// 创建二叉树
private static TreeNode creatTree(Scanner in) {
// TODO Auto-generated method stub
TreeNode newNode;
int val=in.nextInt();
if (val==-1) { //设置 -1 为结束数字
val=in.nextInt();
}
if (val!=0) { // 0 代表空节点
newNode=new TreeNode(val);
}else {
newNode=null;
return null;
}
newNode.left=creatTree(in);
newNode.right=creatTree(in);
return newNode;
}
// 打印二叉树
private static void display(TreeNode root) {
// TODO Auto-generated method stub
if (root!=null) {
System.out.print(root.val+" ");
display( root.left);
display(root.right);
}
}
}
测试结果:
代码:
package question25;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class PathInPeek {
ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list=new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
int currentSum=0;
recurisve(root,target,currentSum);
return result;
}
private void recurisve(TreeNode root,int target,int currentSum) {
currentSum+=root.val;
list.add(root.val);
boolean isLeaf=root.left==null&&root.right==null;
if (currentSum==target&&isLeaf) {
result.add(new ArrayList<Integer>(list)); //注意:此处不能 是 result.add(list) ,因为list 只是一个指针,list的内容 会变。
}
if (currentSum<target&&root.left!=null) {
recurisve(root.left, target, currentSum);
}
if (currentSum<target&&root.right!=null ) {
recurisve(root.right, target, currentSum);
}
list.remove(list.size()-1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
System.out.println("请输入树 的先序遍历:");
TreeNode root=creatTree(in);
System.out.println("下面是树 的先序遍历:");
display(root);
System.out.println();
PathInPeek ly=new PathInPeek();
ly.FindPath(root, 22);
System.out.println("以下是所有路径");
System.out.println(ly.result);
}
// 创建二叉树
private static TreeNode creatTree(Scanner in) {
// TODO Auto-generated method stub
TreeNode newNode;
int val=in.nextInt();
if (val==-1) { //设置 -1 为结束数字
val=in.nextInt();
}
if (val!=0) { // 0 代表空节点
newNode=new TreeNode(val);
}else {
newNode=null;
return null;
}
newNode.left=creatTree(in);
newNode.right=creatTree(in);
return newNode;
}
// 打印二叉树
private static void display(TreeNode root) {
// TODO Auto-generated method stub
if (root!=null) {
System.out.print(root.val+" ");
display( root.left);
display(root.right);
}
}
}
测试结果:
相关文章推荐
- 20.python笔记之装饰器
- java .net compartion
- 编写主引导扇区
- json数据拼接和foreach参数问题
- GUI笔记
- Java Socket网络编程的经典例子(转)
- C++ 对象的内存布局(上)
- C++ 对象的内存布局(上)
- javascript中的错误处理机制
- mysqldump的流程
- Android ViewStub详解
- 调试常用打印方法
- runtime运用实例
- Android ListView 图片异步加载和图片内存缓存
- Codeforces Beta Round #95 (Div. 2) -- E. Yet Another Task with Queens(STL)
- 程序猿学习资料集
- bzoj1221 [HNOI2001]软件开发 & bzoj3280 小R的烦恼
- 杂花生树(三)
- 19.python笔记之Rabbitmq
- UVa 11991 - Easy Problem from Rujia Liu?