题目
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路
从根节点一一遍历判断即可。
注:代码后有链表的复制操作
import java.util.ArrayList;
/**
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>> ans = new ArrayList<ArrayList<Integer>>();
if(root == null)
return ans;
ArrayList<Integer> list = new ArrayList<Integer>();
Find(root, target, ans, list, 0);
return ans;
}
public void Find(TreeNode root, int target,
ArrayList<ArrayList<Integer>> ans, ArrayList<Integer> list, int sum){
if(root == null || sum+root.val > target)
return ;
sum += root.val;
if(root.left == null && root.right == null){
if(target == sum){
list.add(root.val);
ans.add(new ArrayList<Integer>(list));//添加与list链表相同的链表
list.remove(list.size()-1);//移除新加入的节点以便后续其他情况的操作
}
return ;
}
list.add(root.val); //不可放于上一个 if 之前
Find(root.left, target, ans, list, sum);
Find(root.right, target, ans, list, sum);
list.remove(list.size()-1);//移除新加入的节点以便后续其他情况的操作
}
}
链表复制
两种:
①ArrayList<Integer> desc = new ArrayList<Integer>(src);
②Collections.copy(desc, src);
而 直接 a = b 这样的方式一个链表操作会影响另一个链表数据
关于涉及到的深拷贝、浅拷贝不是很明白,如果有可以实践加证明的方法,可以告诉我吗?
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public static void main(String[] args) {
System.out.println("以下对单个链表的所有操作不影响另一个链表的数据(含注释的操作)");
System.out.println("==================ArrayList<Integer> desc = new ArrayList<Integer>(src);===============================");
ArrayList<Integer> a = new ArrayList<Integer>();
a.add(4);
a.add(5);
a.add(65);
for (Integer integer : a) {
System.out.print(integer+" ");
}
System.out.println();
ArrayList<Integer> b = new ArrayList<Integer>(a);
for (Integer integer : b) {
System.out.print(integer+" ");
}
System.out.println();
System.out.println("比较:"+(a==b));
//b.clear();
a.set(0, 1000);
//b.remove(2);
for (Integer integer : a) {
System.out.print(integer+" ");
}
System.out.println();
for (Integer integer : b) {
System.out.print(integer+" ");
}
System.out.println("\n====================Collections.copy(desc, src);=============================");
ArrayList<Integer> c = new ArrayList<Integer>();
c.add(54);
c.add(65);
c.add(87);
Collections.copy(c, b);
System.out.println("比较:"+(c==b));
for (Integer integer : b) {
System.out.print(integer+" ");
}
System.out.println();
for (Integer integer : c) {
System.out.print(integer+" ");
}
System.out.println();
//b.clear();
//c.set(0, 1000);
b.remove(2);
for (Integer integer : c) {
System.out.print(integer+" ");
}
System.out.println();
for (Integer integer : b) {
System.out.print(integer+" ");
}
}
}
运行结果:
如有错误或不合理的地方,敬请指正~
加油!!