java的找出树有多少条路径_Java实现:在二元树中找出和为某一值的所有路径

题目:

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

例如输入整数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> pathListOfSum(int sum){

List> resultList = new ArrayList>();

pathListOfSum(new ArrayList(), resultList, sum, 0);

return resultList;

}

private void pathListOfSum(List pathList, List> resultList, int expectSum, int actualSum){

// 处理当前节点

pathList.add(this.value);

actualSum += this.value;

if (this.leftNode == null && this.rightNode == null){

if (actualSum == expectSum){

List copyList = new ArrayList(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> resultList = bTree.pathListOfSum(22);

for (List list : resultList){

System.out.println(list);

}

}

[10, 5, 7]

[10, 12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值