剑指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对答如流系列 - 二叉树中和为某一值的路径的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer——二叉树中和为某一值的路径》代码

剑指OFFER 二叉树中和为某一值的路径

剑指offer---二叉树中和为某一值的路径

剑指offer 二叉树中和为某一值的路径

剑指offer--31.二叉树中和为某一值的路径

剑指offer之二叉树中和为某一值的路径