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

题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如  输入整数 22 和如下二元树

     10 

    /     \ 

 5     12 

 /   \

4   7

则打印出两条路径:10, 12 和 10, 5, 7。

嘛..需要遍历所有的节点才能得到最后的结果,并且父节点需要在子节点之前参加进递归..所以从二叉树的前序遍历看起

二叉树前序遍历:

public void beforeTrace(Node node)
{
        if(node == null)
              return;

        System.out.println(node.content);
        if(node.leftChild != null)
              beforeTrace(node.leftChild);
        if(node.rightChild != null)
              beforeTrace(node.rightChild);
}
遍历中进入每一个节点的函数都是由它的父节点调用的.符合题目要求

但是在前序遍历中没有它的父节点的信息,而题目需要在某一个节点获得它的父、父父、父父父节点的值的和...所以我们在递归的时候需要添加一个节点值的和..对应的还需要做一个数组来存储它的路径..

根据以上想法修改前序遍历得到:

	public void beforeTrace(Node node,ArrayList<Integer> list,int result)
	{
		if(sum(list) == result)
		{
			out(list);
			return;
		}
		
		if(node == null)
			return;
		
		if(node.leftChild!=null)                              //在父节点处加入子节点的数据和路径,然后进行递归
		{
			list.add(node.leftChild.data);
			beforeTrace(node.leftChild, list, result);
			list.remove(list.size()-1);                   //还原递归状态  
		}
		if(node.RightChild!=null)
		{
			list.add(node.RightChild.data);
			beforeTrace(node.RightChild, list, result);
			list.remove(list.size()-1);                    //还原递归状态
		}
		
			
	}

可见,一般的算法题都是根据基本知识改编的....


类似的还有下面这道题:

判断二叉树中是否存在一个数m,如果存在则输出路径,如果不存在输出错误

也是前序遍历..也是存储路径

和上面那个几乎是一样的,只不过在判断递归满足条件的时候有点不同


说到递归,编程之美上面有几句话说的很不错:

1、先弄清楚递归的顺序;

2、分析清楚递归的逻辑;

3、考虑清楚递归退出的边界条件;

P245..这几句话还是很有帮助的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值