目录
题目描述
输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下直到 叶节点 所经过的节点形成一条路径。二叉树节点的定义如下:
public class BinaryTreeNode { int value; BinaryTreeNode left; BinaryTreeNode right; }
测试用例
- 功能测试(二叉树中有一条、多条符合要求的路径;二叉树中没有符合要求的路径)
- 特殊输入测试(指向二叉树根节点的指针是空指针)
题目考点
- 考察应聘者用例子分析复杂问题的能力。
- 考察应聘者对二叉树前序遍历的理解。
解题思路
对于从节点开始的题目,我们需要想到先序遍历。
- 当用前序遍历的方式访问到某一节点时,就把该节点添加到路径数组中。
- 如果是叶节点且刚好是我们想要的数,则将它的路径保存起来一份。
- 如果当前节点不是叶节点,则继续访问它的子节点。
- 当递归函数退出的时候会返回到它的父节点,所以我们需要在删除路径数组的最后一个节点。
参考解题
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>> result = new ArrayList<>();
ArrayList<Integer> singleresult = new ArrayList<>();
// 异常
if(root == null){
return result;
}
int CurrentSum = 0;
// 调用功能函数,改变形参,方便递归
FindPathCore(root, target, result,singleresult, CurrentSum);
return result;
}
// -----------------功能函数-----------------------------------
public void FindPathCore(TreeNode node, int target, ArrayList<ArrayList<Integer>> result, ArrayList<Integer> singleresult, int CurrentSum){
// 更新当前路径、当前和
CurrentSum += node.val;
singleresult.add(node.val);
// 满足条件则将singleresult存入最终result,为一个子序列
boolean isLeaf = (node.left == null ) && (node.right == null);
if(isLeaf && CurrentSum == target){
result.add(new ArrayList<>(singleresult)); // 先添加,再更新??
//singleresult = new ArrayList<>(); // 更新子序列, 这样写就不对???为啥?
}
// 不是叶节点,继续遍历
if(node.left != null){
FindPathCore(node.left, target, result, singleresult, CurrentSum);
}
if(node.right != null){
FindPathCore(node.right, target, result, singleresult, CurrentSum);
}
// 返回父节点之前,删除路径上当前节点
singleresult.remove(singleresult.size() - 1);
}
}