题目:输入一个二叉树和一个整数,打印出二叉树中结点值得和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的
结点形成一条路径。
例如输入整数22和如下二元树
10
/ /
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
遍历方式中,只有前序遍历是首先访问根结点。
当从父结点访问子结点时,我们不知道前面经过了哪些结点,除非我们把经过的路径上的节点保存下来。每访问到一个结点,就把当前的
结点添加到路径中去。当返回到父结点时,需要从 路径中删除当前结点。
如下,Java 代码
package windows;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class FindPath {
public static void main(String[] args) {
BinaryTreeNode node1 = new BinaryTreeNode(10);
BinaryTreeNode node2 = new BinaryTreeNode(5);
BinaryTreeNode node3 = new BinaryTreeNode(4);
BinaryTreeNode node4 = new BinaryTreeNode(7);
BinaryTreeNode node5 = new BinaryTreeNode(12);
node1.left = node2;
node1.right = node5;
node2.left = node3;
node2.right = node4;
findPath(node1,19);
}
public static void findPath(BinaryTreeNode root, int sum){
if(root==null) return;
ArrayList<Integer> list = new ArrayList<Integer>();
int currentSum = 0;
findPath(root,sum,list,currentSum);
}
private static void findPath(BinaryTreeNode node, int sum, List<Integer> list, int currentSum){
currentSum += node.val;
list.add(node.val);
boolean isLeaf = node.left==null && node.right == null;
if(currentSum==sum&&isLeaf){
Iterator<Integer> iter = list.iterator();
while(iter.hasNext()){
System.out.print(iter.next()+" ");
}
System.out.println();
}
if(node.left!=null)findPath(node.left,sum,list,currentSum);
if(node.right!=null) findPath(node.right,sum,list,currentSum);
list.remove(list.size()-1);
}
}
class BinaryTreeNode{
BinaryTreeNode left;
BinaryTreeNode right;
int val;
BinaryTreeNode(int val){
this.val = val;
}
public String toString(){
return this.val+"";
}
}