题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
树节点的定义为:
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
这是典型的递归题,个人想法是:从根节点开始进行递归操作,递归过程中涉及的变量有:path记录根节点到当前节点的上一个节点所有节点的值,sum表示path中所有数的总和,target表示目标数,result表示结果集,每次递归操作的内容为:
0、若当前节点为空,结束当前运行
1、将当前节点的值加入path路径中,记录路径
2、sum加上当前节点的值
3、如果当前节点为叶节点,比较sum与target是否相同,若是,将path添加到result集中
4、从当前节点左子树的根值开始递归
5、从当前节点右子树的根值开始递归
6、从path中去掉当前节点的值
之后再将result按长度排序即可,这里使用的是冒泡排序,文字理解可能有点难度,看代码好一点。
import java.util.ArrayList;
public class ErchashuLujinhe {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target){
int sum = 0;
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> path = new ArrayList<Integer>();
find(result,path,root,target,sum);
for(int i=result.size()-2;i>=0;i--) {
for(int j=0;j<=i;j++) {
if(result.get(j+1).size()>result.get(j).size()) {
ArrayList<Integer> temp = result.get(j);
result.set(j, result.get(j+1));
result.set(j+1, temp);
}
}
}
return result;
}
public void find(ArrayList<ArrayList<Integer>> result,ArrayList<Integer> path,TreeNode root,int target,int sum) {
if(root==null)return;
path.add(root.val);
sum+=root.val;
if(root.left==null&&root.right==null) {
if(sum==target) {
ArrayList<Integer> temp = new ArrayList<Integer>();
for(int k = 0;k<path.size();k++)
temp.add(path.get(k));
result.add(temp);
}
}
TreeNode temp = root;
root = temp.left;
find(result,path,root,target,sum);
root = temp.right;
find(result,path,root,target,sum);
path.remove(path.size()-1);
}
public static void main(String[]args) {
TreeNode root = new TreeNode(10);
root.left = new TreeNode(5);
root.right = new TreeNode(12);
root.right.left = null;
root.right.right = null;
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(7);
root.left.left.left = null;
root.left.left.right = null;
root.left.right.left = null;
root.left.right.right = null;
ErchashuLujinhe e = new ErchashuLujinhe();
System.out.println(e.FindPath(root, 22));
}
}