题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数 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..这几句话还是很有帮助的