请写一个程序创建一棵二元树,并按照一定规则,输出二元树根节点到叶子节点的路径。规则如下:
从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条路径上的所有节点。从根节点遍历树时,请请按照左到右遍历,即优先访问左子树的节点。
比如下面一些转化的例子:
输入"10,5,12,4,7"值,构造的树如下(注意:构造二元树时,需要从上到下一层一层的,按照从左到右的顺序进行构造)
1) 10
2) 10
/
5
3) 10
/\
5 12
4) 10
/\
5 12
/
4
5) 10
/\
5 12
/\
4 7
如果当前我们设置的“路径和”为19,那么输出结果为:"10,5,4$",如果当前我们设置的值为22,那么输出结果为:"10,5,7$10,12$",$字符表
示结尾。如果没有找到路径和为设置的值的路径,输出'\0',即无显示
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
class Node{
int data;
Node lChild;
Node rChild;
boolean visited;
}
public class Main{
static boolean flag=false;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int num=scanner.nextInt();
Stack<Node> stack=new Stack<Node>();
String s=scanner.next();
String[] str=s.split(",");
Node root=create(str);
findPath(root,num,stack,0);
if(flag==false){
System.out.println("\0");
}
}
@SuppressWarnings("unchecked")
public static void findPath(Node root,int num,Stack<Node> stack,int temp){
if(root==null){
return;
}
if(root.visited==true){
return;
}
temp=temp+root.data;
root.visited=true;
stack.add(root);
if(temp<num){
if(root.lChild!=null&&root.lChild.visited==false){
findPath(root.lChild,num,stack,temp);
}
Stack<Node> s=(Stack<Node>) stack.clone();
if(root.rChild!=null&&root.rChild.visited==false){
findPath(root.rChild,num,s,temp);
}
if(root.lChild==null&&root.rChild==null){
Node p=stack.pop();
temp=temp-p.data;
return;
}
}
if(temp>num){
Node p=stack.pop();
temp=temp-p.data;
return;
}
if(temp==num){
if(root.lChild==null&&root.rChild==null){
flag=true;
Stack<Node> result=new Stack<Node>();
String s="";
Node p;
while(!stack.isEmpty()){
result.add(stack.pop());
}
while(!result.isEmpty()){
p=result.pop();
s=s+p.data+",";
}
s=s.substring(0,s.length()-1)+"$";
System.out.println(s);
}else{
Node p=stack.pop();
temp=temp-p.data;
return;
}
}
}
public static Node create(String[] str){
Node root=new Node();
Node p,q;
int temp;
Queue<Node> queue=new LinkedList<Node>();
queue.add(root);
for(int i=0;i<str.length;i++){
temp=Integer.parseInt(str[i]);
q=new Node();
q.data=temp;
p=queue.peek();
while(p!=null&&p.lChild!=null&&p.rChild!=null){
queue.poll();
p=queue.peek();
}
if(p.data==0){
p.data=temp;
continue;
}
if(p.lChild==null){
p.lChild=q;
queue.add(q);
continue;
}
if(p.rChild==null){
p.rChild=q;
queue.add(q);
continue;
}
}
return root;
}
}