剑指offer--面试题25:二叉树中和为某一值的路径--Java实现
2015-06-21 17:14
761 查看
题目描述:
输入一课二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
解题思路:
先模拟一下过程:树的结构如下所示,期待路径的和为22
10→5→4是一条路径,它们的和不是22。所以下一条路径10→5→7,(这是一种回溯的方法),它们的和22,然后回溯,下一条路径10→12。这里我们只有到叶子结点才有必要判断和是否等于期待的数值。
首先需要选择一种遍历方式,一定是深度优先,进一步要先访问根结点,所以选择先序遍历。
然后是选择一种数据结构保存路径,因为回溯的话肯定是要知道之前的结点的。一般采用栈结构,但是这里注意一点就是题目中要求打印路径,而打印栈中的元素是要出栈的,所以我们可以用普通的链表模仿栈的行为。
代码如下:
输入一课二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
解题思路:
先模拟一下过程:树的结构如下所示,期待路径的和为22
10→5→4是一条路径,它们的和不是22。所以下一条路径10→5→7,(这是一种回溯的方法),它们的和22,然后回溯,下一条路径10→12。这里我们只有到叶子结点才有必要判断和是否等于期待的数值。
首先需要选择一种遍历方式,一定是深度优先,进一步要先访问根结点,所以选择先序遍历。
然后是选择一种数据结构保存路径,因为回溯的话肯定是要知道之前的结点的。一般采用栈结构,但是这里注意一点就是题目中要求打印路径,而打印栈中的元素是要出栈的,所以我们可以用普通的链表模仿栈的行为。
代码如下:
import java.util.LinkedList; import java.util.List; public class FindPathTest { static class Node{ int key; Node left; Node right; Node(int key){ this.key = key; } } public static void findPath(Node root, int expect){ if(root == null){ return; } List<Node> path = new LinkedList<Node>(); int currentSum = 0; findPath(root, expect, path, currentSum); } private static void findPath(Node node, int expect, List<Node> path, int currentSum) { currentSum += node.key; path.add(node); if(node.left == null && node.right == null && currentSum == expect){ System.out.println("A path is found : "); for(Node n : path){ System.out.print(n.key + " "); } System.out.println(""); } if(node.left != null){ findPath(node.left, expect, path, currentSum); } if(node.right != null){ findPath(node.right, expect, path, currentSum); } path.remove(path.size() - 1); } public static void main(String[] args) { Node root = new Node(8); Node node8 = new Node(8); Node node7 = new Node(7); root.left = node8; root.right = node7; Node node9 = new Node(9); node8.left = node9; Node node2 = new Node(2); node8.right = node2; Node node4 = new Node(4); Node node72 = new Node(7); node2.left = node4; node2.right = node72; findPath(root, 15); } }
相关文章推荐
- 读《人,绩效和职业道德》有感
- 《人,绩效和职业道德》读后感
- 黑马程序员--集合
- 黑马程序员——集合(三)
- 黑马程序员---API集合
- 程序员技术练级攻略(皓哥)
- 黑马程序员_JAVA的构造方法
- 人,绩效,职业道德,一个程序员的生命周期,读后感。
- 程序员能力矩阵 — 敢测吗?看自己在哪个档次
- 剑指offer 面试题3
- 剑指offer--面试题24:二叉搜索树的后序遍历序列--Java实现
- 面试题24 二叉搜索树的后序遍历序列
- 黑马程序员——Java中的反射技术
- 经典面试题:链表的相交与环问题
- 【剑指offer 面试题16】反转链表
- 黑马程序员--Java学习日记之基础知识(数据类型和运算符)
- 黑马程序员---高级-反射
- 黑马程序员_Java_多线程
- 《一个程序员的生命周期》读后感
- 黑马程序员---API