面试题34:二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过所经过的节点形成一条路径。
思路:
- 由于路径是从根节点出发到叶节点,也就是说路径总是以根节点为起始点,因此我们首先需要遍历根节点。在树的前序、中序、后序三种遍历方式中,只有前序遍历是首先访问根节点的。
- 当前序遍历访问到某一节点时,我们把该节点添加到路径上,并累加该节点的值。如果该节点为叶节点,并且路径中节点值的和刚好等于输入的整数,则当前路径符合要求,我们将其打印。如果当前节点不是叶节点,则继续访问它的子节点。当前节点访问结束后,递归函数将自动回到其父节点的位置。因此,我们在函数退出之前在路径上删除当前节点,然后继续遍历即可。
代码实现:
package Question34;
import com.sun.source.tree.Tree;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class T01 {
static List<List<Integer>> paths = new ArrayList<List<Integer>>();
public static void main(String[] args) {
List<Integer> path = new ArrayList<Integer>();
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(1);
TreeNode node4 = new TreeNode(1);
node1.left = node2;
node1.right = node3;
node3.left = node4;
findPath(node1, path, 3, 0);
for(List<Integer> p : paths) {
System.out.println(p);
}
}
public static void findPath(TreeNode root, List<Integer> path, int expectedSum, int curSum) {
path.add(root.val);
curSum += root.val;
if(root.left == null && root.right == null) {
if(curSum == expectedSum) {
List<Integer> temppath = new ArrayList<Integer>();
temppath.addAll(path);
paths.add(temppath);
}
path.remove(path.size() - 1);
return ;
}
if(root.left != null) findPath(root.left, path, expectedSum, curSum);
if(root.right != null) findPath(root.right, path, expectedSum, curSum);
path.remove(path.size() - 1);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}