前言
本文主要介绍如何把二叉树所有路径的各个节点值累计起来并返回。
正文
给出一个二叉树的根节点,计算从这个二叉树结点到每一个叶子节点的节点和,也就是从根节点一直到一条线上的叶子节点所有节点的累计和,然后放入集合返回如[7, 8, 10, 11]。
注:叶子节点是指没有子节点的节点。
如图所示:
图中,从根节点到所有的叶子节点一共有4条路径,1->2->4 、 1->2->5 等,节点的累计和就是每个路径的数值相加。
思路分析
这个题目还是很简单的,只需要依次遍历整个树,将每条路径的节点的值累加起来即可。
已上图为例,图中一种有4条路径,分别为:
- 1 -> 2 -> 4,累加和为 7。
- 1 -> 2 -> 5,累加和为 8。
- 1 -> 3 -> 6,累加和为 10。
- 1 -> 3 -> 7,累加和为 11。
所以,根据这4条路径,我们返回的值应该是[7, 8, 10, 11]。
现在需要思考一个问题,我怎么知道这条路有没有走完呢?这个判断也很简单,只需要判断一个节点他的左子节点和右子节点是否都为空就可以了。
在题目中,还有一个要求是,把各个路径的累加和放入集合中返回,这样的话,我们可以先准备一个集合,在遍历路径节点的时候,如果发现一个节点没有子节点了,那么就把得到的累加和放入集合中即可。
代码实现
定义二叉树的节点,代码如下:
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
下面来看下收集二叉树各个路径节点值的代码,代码如下:
public List<Integer> getPathSum(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
process(root, 0, result);
return result;
}
public void process(TreeNode x, int preSum, List<Integer> result) {
if (x.left == null && x.right == null) {
result.add(x.val + preSum);
return;
}
// x是非叶节点
preSum += x.val;
if (x.left != null) {
process(x.left, preSum, result);
}
if (x.right != null) {
process(x.right, preSum, result);
}
}
运行一下代码,结果如下:
总结
本文主要介绍如何把二叉树的路径和,本次题目还是很简单的,而且思路比较清晰。与本文类似的题目也有很多,比如是否存在与二叉树的路径与给出的某一个数是否相等,二叉树所有路径的节点和等,一般是采用递归的方式比较方便,当然也可以不采用递归的方式,如采用队列也可以实现,这里就不再介绍了。