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

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


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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值