# 剑指offer第二版-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){
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，可进行剪枝
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){
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