Leetcode 865. 具有所有最深节点的最小子树 | 刷题打卡

478 阅读2分钟

题目描述

给定一个根为 root 的二叉树,每个节点的深度是 该节点到根的最短距离

如果一个节点在整个树的任意节点之间具有最大的深度,则该节点是最深的 。

一个节点的子树是该节点加上它的所有后代的集合。

返回能满足以该节点为根的子树中包含所有最深的节点这一条件的具有最大深度的节点。

image.png

输入:root = [3,5,1,6,2,0,8,null,null,7,4]
输出:[2,7,4]
解释:
我们返回值为 2 的节点,在图中用黄色标记。
在图中用蓝色标记的是树的最深的节点。
注意,节点 5、3 和 2 包含树中最深的节点,但节点 2 的子树最小,因此我们返回它。

分析思路

实际上该题的题目意思可以转换为求所有最深叶节点的最近公共祖先节点。

最深的叶节点他们的高度都是相同的,所以我们只需要从根节点出发,求每一个节点它的左右子树的高度是否相同。

步骤:

  1. 如果节点的左右子树高度相同,那么该节点就是结果。
  2. 如果左子树的高度大于右子树,那么所求节点在左子树中。
  3. 如果右子树的高度大于左子树,那么所求节点在右子树中。

AC 代码

public TreeNode subtreeWithAllDeepest(TreeNode root) {
    if(root == null) return null;        
    
    // 求左子树的高度
    int lh = treeHight(root.left);
    // 求右子树的高度
    int rh = treeHight(root.right);

    // 如果左右子树高度相同,则返回结果
    if(lh == rh){
        return root;
    } else if(lh > rh){
        // 如果左子树高度大于右子树高度,则节点在左子树中
        return subtreeWithAllDeepest(root.left);
    } else {
        // 如果左子树高度小于右子树高度,则节点在右子树中
        return subtreeWithAllDeepest(root.right);
    }
}

public int treeHight(TreeNode node){
    if(node == null) return 0;
    return Math.max(treeHight(node.left), treeHight(node.right)) + 1;
}

总结

这题主要的关键就是要知道最深叶子节点的高度是相同,利用这个特性,我们就可以利用高度一步步逼近我们所要的结果,这种解发的时间复杂度为 O (h * n),h 为树高。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情