您的位置:首页 > 编程语言 > Java开发

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

2015-02-02 23:50 423 查看
题目:

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

例如输入整数 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: