Java实现:在二元树中找出和为某一值的所有路径

本文介绍了一种算法,用于找出二叉树中所有节点路径和等于给定值的路径。通过递归方法遍历二叉树,并跟踪路径上的节点值总和来实现。给出的Java代码示例展示了如何构建二叉树并找到和为22的所有路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

        输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。

        例如输入整数 22 和如下二元树

            10

          /     \
        5     12

      /   \

    4     7


解题思路:

二叉树的中序递归。 

Java实现:

public class BinaryTreeNode {
	private Integer value;
	private BinaryTreeNode leftNode;
	private BinaryTreeNode rightNode;
	
	public void add(int value){
		if (this.value == null){
			this.value = value;
			return;
		}
		if (value > this.value){
			if (this.rightNode == null){
				this.rightNode = new BinaryTreeNode();
				this.rightNode.value = value;
			} else {
				this.rightNode.add(value);
			}
		} else if (value < this.value){
			if (this.leftNode == null){
				this.leftNode = new BinaryTreeNode();
				this.leftNode.value = value;
			} else {
				this.leftNode.add(value);
			}
		}
	}
	
	public List<List<Integer>> pathListOfSum(int sum){
		List<List<Integer>> resultList = new ArrayList<List<Integer>>();
		pathListOfSum(new ArrayList<Integer>(), resultList, sum, 0);
		return resultList;
	}
	
	private void pathListOfSum(List<Integer> pathList, List<List<Integer>> resultList, int expectSum, int actualSum){
		// 处理当前节点
		pathList.add(this.value);
		actualSum += this.value;
		if (this.leftNode == null && this.rightNode == null){
			if (actualSum == expectSum){
				List<Integer> copyList = new ArrayList<Integer>(pathList.size());
				for (Integer data : pathList){
					copyList.add(data);
				}
				resultList.add(copyList);
			}
		}
		
		// 递归处理左子节点
		else if (this.leftNode != null){
			this.leftNode.pathListOfSum(pathList, resultList, expectSum, actualSum);
		}
		
		// 递归处理右子节点
		else if (this.rightNode != null){
			this.rightNode.pathListOfSum(pathList, resultList, expectSum, actualSum);
		}
		
		pathList.remove(pathList.size() - 1);
		actualSum -= this.value;
	}
}

测试:

@Test
	public void testPathListOfSum() {
		BinaryTreeNode bTree = new BinaryTreeNode();
		bTree.add(10);
		bTree.add(12);
		bTree.add(5);
		bTree.add(7);
		bTree.add(4);
		List<List<Integer>> resultList = bTree.pathListOfSum(22);
		for (List<Integer> list : resultList){
			System.out.println(list);
		}
	}

[10, 5, 7]
[10, 12



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值