二叉树中节点中只包含正整数值。
使用递归的方式实现,用一个双端队列保存已经经过的节点。到达一个节点的时候,比较当前的和再加上当前节点值是否等于目标值,若等于则输出已经经过的节点和当前节点;若不等于,则将当前节点追加到队列的尾部,再前往当前节点的子节点。
import java.util.LinkedList;
public class FindSum {
//树中的节点类
static class TreeNode{
int val;
TreeNode left,right;
public TreeNode(int val){
this.val=val;
left=null;
right=null;
}
}
public static void find(LinkedList<TreeNode> list,TreeNode root,int curSum,int target){
if(curSum+root.val == target){
for(TreeNode node:list){
System.out.print(node.val+" ");
}
System.out.println(root.val);
}
if(root.left != null){
list.addLast(root);
find(list,root.left,curSum+root.val,target);
list.removeLast();
}
if(root.right !=null){
list.addLast(root);
find(list,root.right,curSum+root.val,target);
list.removeLast();
}
}
//中序遍历函数,不是必须的
public static void display(TreeNode root){
if(root.left != null)
display(root.left);
System.out.print(root.val+" ");
if(root.right != null)
display(root.right);
}
public static void main(String[] args){
//手动构造一棵树
TreeNode n1=new TreeNode(5);
TreeNode n2=new TreeNode(4);
TreeNode n3=new TreeNode(9);
TreeNode n4=new TreeNode(11);
TreeNode n5=new TreeNode(2);
TreeNode n6=new TreeNode(7);
TreeNode n7=new TreeNode(3);
TreeNode n8=new TreeNode(14);
TreeNode n9=new TreeNode(4);
n1.left=n2;
n1.right=n3;
n2.left=n4;
n2.right=n5;
n3.left=n6;
n3.right=n7;
n5.right=n8;
n6.left=n9;
// display(n1);
LinkedList<TreeNode> list=new LinkedList<TreeNode>();
find(list,n1,0,25);
System.out.println("done");
}
}