北川广海の梦

北川广海の梦

二叉树查询最深的叶子节点和

2020-06-19

对于一课二叉树,要求得到所有最深深度的叶子节点的和。

题目很简单,它其实是求二叉树所有叶子节点的和的一个小变种。

先看看如果要求所有叶子节点的和:

    int res = 0;

    public int leafTotal(TreeNode root) {
        search(root);
        return res;
    }

    public void search(TreeNode root) {
        if (root == null) return;
        if (root.right == null && root.left == null) {
            res += root.val;
        }
        if (root.left != null) {
            search(root.left);
        }
        if (root.right != null) {
            search(root.right);
        }
    }

非常常规的二叉树递归遍历框架。只要判断二叉树是否为叶子节点,是的话在结果中加上叶子节点的值即可。

那么题目所说的最深深度怎么办呢?

很简单,在递归的参数列表中,额外保存一下当前递归的深度即可。

    int maxDep = 0;
    int total = 0;

    public int deepestLeavesSum(TreeNode root) {
        if (root == null) return total;
        search(root, 1);
        return total;
    }

    private void search(TreeNode root, int deep) {
        if (root.left != null) {
            search(root.left, deep + 1);
        }
        if (root.right != null) {
            search(root.right, deep + 1);
        }
        if (deep == maxDep) {
            total += root.val;
            return;
        }
        if (deep < maxDep) {
            return;
        }
        maxDep = deep;
        total = root.val;
    }

我们只需要判断当前节点的深度是否大于保存着的最大深度,如果等于,则在结果中加上节点值,如果小于,说明这个节点不是我们想要的。如果大于,则说明第一次发现了更深的节点,那么以前查询的结果因该被舍弃,这个节点的深度成为最大深度。

非叶子节点不需要将它单独拎出来判断一下,因为它的子节点一定比它深,它的值一定不会被用到的。

以上两个方法的时间复杂度O(N) 取决于叶子节点的个数,空间复杂度则是最大递归栈深度决定的,即二叉树的高度,这个怎么表达啊??咱也不是很清楚。