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

来源:互联网 发布:人工智能企业 编辑:程序博客网 时间:2024/06/06 04:03

请写一个程序创建一棵二元树,并按照一定规则,输出二元树根节点到叶子节点的路径。规则如下:
从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条路径上的所有节点。从根节点遍历树时,请请按照左到右遍历,即优先访问左子树的节点。


比如下面一些转化的例子:

输入"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;}}



0 0