题目:输入一棵二叉树和一个整数, 打印出二叉树中结点值的和为输入整数的所有路径。
递归是参数的递归
从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
原来根据大神的思路以为要使用栈,其实不是,是使用的类似于栈的数组List,当使用到递归的时候就需要考虑到递归传递的参数是那几个,只有这样才可以实现正常的递归操作。
package 剑指offer;
/*题目:输入一棵二叉树和一个整数, 打印出二叉树中结点值的和为输入整数的所有路径。
* 从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
*/
import java.util.*;
public class Test25 {
public static class BinaryTree2Node {
int value;
BinaryTree2Node left;
BinaryTree2Node right;
}
public static void findPath(BinaryTree2Node node, int expectNum){
List<Integer> list = new ArrayList<>();
if(node != null){
findPath(node, 0, expectNum, list);
}
}
// 思考为什么要递归四个参数,少一个行不行
public static void findPath(BinaryTree2Node root, int curNum,
int expectNum, List<Integer> result){
if(root != null){
curNum += root.value;
result.add(root.value);
if(curNum < expectNum){
// 递归左子树和右子树
findPath(root.left, curNum, expectNum, result);
findPath(root.right, curNum, expectNum, result);
}
else if(curNum == expectNum){
if (root.left == null && root.right == null) {
System.out.println(result);
}
}
result.remove(result.size() - 1);
}
}
public static void main(String[] args) {
// 10
// / \
// 5 12
// /\
// 4 7
BinaryTree2Node root = new BinaryTree2Node();
root.value = 10;
root.left = new BinaryTree2Node();
root.left.value = 5;
root.left.left = new BinaryTree2Node();
root.left.left.value = 4;
root.left.right = new BinaryTree2Node();
root.left.right.value = 7;
root.right = new BinaryTree2Node();
root.right.value = 12;
// 有两条路径上的结点和为22
System.out.println("findPath(root, 22);");
findPath(root, 22);
// 没有路径上的结点和为15
System.out.println("findPath(root, 15);");
findPath(root, 15);
// 有一条路径上的结点和为19
System.out.println("findPath(root, 19);");
findPath(root, 19);
}
}
递归是参数的递归