剑指Offer对答如流系列 - 二叉树中和为某一值的路径
Posted jefferychenxiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer对答如流系列 - 二叉树中和为某一值的路径相关的知识,希望对你有一定的参考价值。
面试题34:二叉树中和为某一值的路径
题目描述
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
比如说下面这棵树,输入二叉树和整数22,则打印出两条路径,一条是10 12 另一条是10 5 7
树的结构定义如下:
public class Node{
int e;
Node left;
Node right;
Node(int x) { e = x; }
}
问题分析
从上往下,找一条路径,由于是从根节点出发,我们选用前序遍历。
如果我们找到了其中一条路径,达到叶节点后,由于没有指向父节点的引用,所以必须提前创建一个链表存储前面经过的节点。
基于上面可以说,通过前序遍历,从根节点出发,每次在链表中存储遍历到的节点,若到达叶子节点,则根据所有节点的和是否等于输入的整数,判断是否打印输出。
强调的这部分 可以变成
在每次遍历到一个节点时,令目标整数等于自己减去当前节点的值,若到达根节点时,最终的目标整数等于0就可以打印输出
, 上面的是书上的,这里的是个人实现的。
在当前节点访问结束后,我们需要返回到它的父节点,这个可以通过递归来实现,不过在函数一层一层返回之前要删除链表中的当前节点,以确保最终正确返回父节点。
问题解答
public void findPath(Node root, int target) {
if(root==null) {
return;
}
ArrayList<Integer> list= new ArrayList<>();
printPath(root, target,list);
}
private void printPath(Node node,int target,ArrayList<Integer> list) {
if(node==null) {
return;
}
list.add(node.e);
// 每个节点的target不会受到方法的影响而改变
target -= node.e;
// 叶子节点
if(target==0 && node.left==null && node.right==null) {
for (Integer integer : list)
System.out.print(integer+" ");
System.out.println();
} else { //中间节点
printPath(node.left, target, list);
printPath(node.right, target, list);
}
// 移除当前节点
list.remove(list.size()-1);
}
以上是关于剑指Offer对答如流系列 - 二叉树中和为某一值的路径的主要内容,如果未能解决你的问题,请参考以下文章