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

本系列导航:剑指offer(第二版)java实现导航帖

面试题34:二叉树中和为某一值的路径

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

解题思路:
需要得到所有从根节点到叶节点的路径,判断和是否为给定值。自己写一个小的二叉树,通过模拟上述过程,发现获取所有路径的过程与前序遍历类似。
因此,可以对给定二叉树进行前序遍历。当被访问节点时叶节点时,判断路径和是否为给定值。此外,为了记录路径上的节点,需要一个数组。

package chapter4;
import structure.TreeNode;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by ryder on 2017/7/18.
 * 二叉树中和为某一值的路径
 */
public class P182_FindPath {
    //用类似于前序遍历的思路解决
    public static void findPath(TreeNode<Integer> root,int exceptedSum){
        if(root==null)
            return;
        List<Integer> path = new ArrayList<>();
        findPath(root,path,exceptedSum,0);
    }
    //curNode为将要被访问的节点,还未被加入到path中
    public static void findPath(TreeNode<Integer> curNode,List<Integer> path,int exceptedSum,int currentSum){
        path.add(curNode.val);
        currentSum+=curNode.val;
        if(curNode.left!=null)
            findPath(curNode.left,path,exceptedSum,currentSum);
        if(curNode.right!=null)
            findPath(curNode.right,path,exceptedSum,currentSum);
        if(curNode.left==null && curNode.right==null && currentSum==exceptedSum)
            System.out.println(path);
        path.remove(path.size()-1) ;
    }
   
    public static void main(String[] args) {
        //            10
        //          /   \
        //         5     12
        //       /  \
        //      4    7
        TreeNode<Integer> root = new TreeNode<Integer>(10);
        root.left = new TreeNode<Integer>(5);
        root.right = new TreeNode<Integer>(12);
        root.left.left = new TreeNode<Integer>(4);
        root.left.right = new TreeNode<Integer>(7);
        findPath(root,22);
        findPath2(root,22);
    }
}

如果二叉树的所有节点值都是大于0的(原题中并没有这个条件),可以进行剪枝。

//如果所有节点值均大于0,可进行剪枝
    public static void findPath2(TreeNode<Integer> root,int exceptedSum){
        if(root==null)
            return;
        List<Integer> path = new ArrayList<>();
        findPath2(root,path,exceptedSum,0);
    }
     //curNode为将要被访问的节点,还未被加入到path中
    public static void findPath2(TreeNode<Integer> curNode,List<Integer> path,int exceptedSum,int currentSum){
        path.add(curNode.val);
        currentSum+=curNode.val;
        //只有当currentSum小于exceptedSum时需要继续当前节点的子节点的遍历
        if(currentSum<exceptedSum){
            if(curNode.left!=null)
                findPath2(curNode.left,path,exceptedSum,currentSum);
            if(curNode.right!=null)
                findPath2(curNode.right,path,exceptedSum,currentSum);
        }
        //currentSum大于等于exceptedSum时可以直接停止当前分支的遍历,因为当前分支下currentSum只会越来越大,不会再有符合要求的解
        else if(currentSum==exceptedSum && curNode.left==null && curNode.right==null)
            System.out.println(path);
        path.remove(path.size()-1) ;
    }

运行结果

[10, 5, 7]
[10, 12]
[10, 5, 7]
[10, 12]

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 3,247评论 1 30
  • 面试题7:重建二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果。请重建该二叉树。假设输入的前序遍历和中序遍历...
    lyoungzzz阅读 172评论 0 0
  • 基于树实现的数据结构,具有两个核心特征: 逻辑结构:数据元素之间具有层次关系; 数据运算:操作方法具有Log级的平...
    yhthu阅读 2,021评论 1 5
  • 二叉树中和为某一值的路径 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定...
    echoVic阅读 1,024评论 1 3
  • 0. 什么是树 数据的基本单位是数据元素,在涉及到数据处理时数据元素之间的关系称之为结构,我们依据数据元素之间关系...
    安安zoe阅读 130评论 0 0