剑指offer23--路径所用值之和

题目:输入一棵二叉树和一个整数, 打印出二叉树中结点值的和为输入整数的所有路径。

从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

其实是相当于使用的栈的方式,但是栈是不好打印的,所用说使用的队列来模拟栈的方式

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);
	 }
}

正确使用递归,确定递归的参数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值