二叉树中和为某一值得路径java

题目:输入一个二叉树和一个整数,打印出二叉树中结点值得和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的

结点形成一条路径。

例如输入整数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+"";
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值