小渣渣的算法学习笔记:2018秋招备战
数据结构类算法总结:二叉树
数据结构类算法总结:二叉树
1.题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
2.代码实现:
public class Solution34 { private static class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public static void main(String[] args) { Solution34 s = new Solution34(); TreeNode t1 = new TreeNode(10); TreeNode t2 = new TreeNode(5); TreeNode t3 = new TreeNode(12); TreeNode t4 = new TreeNode(4); TreeNode t5 = new TreeNode(7); t1.left = t2; t1.right = t3; t2.left = t4; t2.right = t5; ArrayList<ArrayList<Integer>> arr = s.FindPath(t1,22); System.out.println(arr); } public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { ArrayList<ArrayList<Integer>> arr=new ArrayList<ArrayList<Integer>>(); if(root==null) return arr; //存储当前路径的各个结点之和 ArrayList<Integer> a1=new ArrayList<Integer>(); int sum=0; //统计单条路径的方法 pa(root,target,arr,a1,sum); return arr; } public void pa(TreeNode root,int target,ArrayList<ArrayList<Integer>> arr, ArrayList<Integer> a1,int sum){ if(root==null) return ; sum+=root.val;//将根节点的值加入到路径之和中 if(root.left==null&&root.right==null){//扫描到叶子结点,如果当前路径之和等于目标值 if(sum==target) { a1.add(root.val);//将当前结点添加到目标路径数组列表中 arr.add(new ArrayList<Integer>(a1));//当该条路径放入成功路径列表集中 a1.remove(a1.size()-1);//清空工具数组列表 } return ; } a1.add(root.val); pa(root.left,target,arr,a1,sum); pa(root.right,target,arr,a1,sum); a1.remove(a1.size()-1); } // public void findPath(TreeNode root,int expectedSum){ // if(root == null) return; // Stack<Integer> path = new Stack<Integer>(); // int currentSum = 0; // findPath(root,expectedSum,path,currentSum); // } // // public void findPath(TreeNode root, int expectedSum, Stack<Integer> path,int currentSum){ // currentSum = currentSum+root.val; // path.push(root.val); // // //如果是叶节点且路径上叶节点的和等于目标值,则打印出这条路径 // boolean isLeaf = root.left == null && root.right == null; // if(currentSum == expectedSum && isLeaf){ // System.out.print("a path is find:"); // while (!path.isEmpty()){ // System.out.print(path.pop()+" "); // } // System.out.println(); // } // //如果不是叶节点,则遍历他的子结点 // if(root.left != null){ // findPath(root.left,expectedSum,path,currentSum); // } // if(root.right != null){ // findPath(root.right,expectedSum,path,currentSum); // } // // //在返回父节点之前,在路径中删除当前结点 // path.pop(); // } }