如何收集二叉树的路径和?

253 阅读2分钟

前言

本文主要介绍如何把二叉树所有路径的各个节点值累计起来并返回。

正文

给出一个二叉树的根节点,计算从这个二叉树结点到每一个叶子节点的节点和,也就是从根节点一直到一条线上的叶子节点所有节点的累计和,然后放入集合返回如[7, 8, 10, 11]

注:叶子节点是指没有子节点的节点。

如图所示:

图中,从根节点到所有的叶子节点一共有4条路径,1->2->41->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);
    }
}

运行一下代码,结果如下:

image.png

总结

本文主要介绍如何把二叉树的路径和,本次题目还是很简单的,而且思路比较清晰。与本文类似的题目也有很多,比如是否存在与二叉树的路径与给出的某一个数是否相等,二叉树所有路径的节点和等,一般是采用递归的方式比较方便,当然也可以不采用递归的方式,如采用队列也可以实现,这里就不再介绍了。