剑指offer-面试题25-二叉树中和为某一值的路径

来源:互联网 发布:执行偏差算法 is 编辑:程序博客网 时间:2024/05/21 06:50

二叉树节点定义:

package case25_FindPathInTree;/** * 二叉树节点结构 * @author WangSai * */public class MyNode {int data;MyNode lchild;MyNode rchild;public MyNode() {}public MyNode(int data) {this.data = data;}}


代码实现:

package case25_FindPathInTree;/** * 题目:题目:输入一棵二叉树和一个整数, 打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 */import java.util.ArrayList;public class FindMyPath {private void findThePath(MyNode root, int expectedSum) {// 异常值检测if (root == null)throw new IllegalArgumentException("非法参数");ArrayList<Integer> mylist = new ArrayList<>();// 递归实现当前节点和上一个节点求和,并且记录当前节点到容器中findThePathCore(root, 0, expectedSum, mylist);}/** *  * @param root,二叉树根节点 * @param currentSum,当前记录的和(还未加上当前结点的值) * @param expectedSum,期望的和 * @param mylist,根结点到当前处理结点的所经过的结点,(还未包括当前结点) */private void findThePathCore(MyNode root, int currentSum, int expectedSum, ArrayList<Integer> mylist) {// 当前节点不为空的情况下,做处理// 求当前节点的值root.data,加上根节点到上一个节点路径上所有节点的值得和// 把当前节点放入容器mylist中// 判断目前为止求得的currentsum的值// 若 < expectedSum,则继续递归左右子节点// 若 == expectedSum,判断是否==expectedSum,如果当前节点是子节点,则打印路径// 执行到这一步说明,打印完成或者当前路径不满足条件,则应该删除最后一个进入容器的元素。if (root == null)return;currentSum += root.data;mylist.add(root.data);if (currentSum < expectedSum) {findThePathCore(root.lchild, currentSum, expectedSum, mylist);findThePathCore(root.rchild, currentSum, expectedSum, mylist);} else if (currentSum == expectedSum) {if (root.lchild == null && root.rchild == null)System.out.println(mylist.toString());}// 删除最后进入容器的元素mylist.remove(mylist.size() - 1);}public static void main(String[] args) {test1();test2();test3();test4();}// 普通二叉树,有满足条件的值//  1// / \// 2 3private static void test1() {FindMyPath fmp = new FindMyPath();MyNode N1 = new MyNode(1);MyNode N2 = new MyNode(2);MyNode N3 = new MyNode(3);N1.lchild = N2;N1.rchild = N3;System.out.println("普通二叉树,有满足条件的值:");fmp.findThePath(N1, 3);}// 普通二叉树,没有满足条件的值private static void test2() {FindMyPath fmp = new FindMyPath();MyNode N1 = new MyNode(1);MyNode N2 = new MyNode(2);MyNode N3 = new MyNode(3);N1.lchild = N2;N1.rchild = N3;System.out.println("普通二叉树,没有 满足条件的值:");fmp.findThePath(N1, 10);}// 只有一个节点的二叉树, 有 满足条件的值private static void test3() {FindMyPath fmp = new FindMyPath();MyNode N1 = new MyNode(1);System.out.println("只有一个节点的二叉树, 有 满足条件的值:");fmp.findThePath(N1, 1);}// 只有一个节点的二叉树, 没有 满足条件的值private static void test4() {FindMyPath fmp = new FindMyPath();MyNode N1 = new MyNode(1);System.out.println("只有一个节点的二叉树, 没有 满足条件的值:");fmp.findThePath(N1, 10);}}



0 0
原创粉丝点击