题目:
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数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