leetcode 865. 具有所有最深节点的最小子树 中等

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

返回包含原始树中所有 最深节点最小子树

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

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

示例 1:

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

示例 2:

复制代码
输入:root = [1]
输出:[1]
解释:根节点是树中最深的节点。

示例 3:

复制代码
输入:root = [0,1,3,null,2]
输出:[2]
解释:树中最深的节点为 2 ,有效子树为节点 2、1 和 0 的子树,但节点 2 的子树最小。

提示:

  • 树中节点的数量在 [1, 500] 范围内。
  • 0 <= Node.val <= 500
  • 每个节点的值都是 独一无二 的。

分析:先用 BFS 求出每个节点的深度和父节点,记录最大深度和最深的节点,将最深的节点放到一个队列里,当这个队列里的节点数大于 1 时,每次将所有节点出队,并用另一个队列记录所有节点的父节点,直到父节点只有一个时,就是所求的答案。

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* subtreeWithAllDeepest(TreeNode* root) {
        int maxn=1;
        map<int,int>depth;
        map<int,TreeNode*>father;
        vector<vector<TreeNode*>>trace(510);
        queue<TreeNode*>que;que.push(root);depth[root->val]=1;trace[1].push_back(root);
        while(!que.empty())
        {
            TreeNode *p=que.front();que.pop();
            if(p->left!=NULL)
            {
                que.push(p->left),father[p->left->val]=p,depth[p->left->val]=depth[p->val]+1;
                maxn=fmax(depth[p->left->val],maxn),trace[depth[p->left->val]].push_back(p->left);
            }
            if(p->right!=NULL)
            {
                que.push(p->right),father[p->right->val]=p,depth[p->right->val]=depth[p->val]+1;
                maxn=fmax(depth[p->right->val],maxn),trace[depth[p->right->val]].push_back(p->right);
            }
        }
        queue<TreeNode*>ans;
        for(int i=0;i<trace[maxn].size();++i)
            ans.push(trace[maxn][i]);
        while(ans.size()>1)
        {
            queue<TreeNode*>temp;map<TreeNode*,int>mp;
            while(!ans.empty())
            {
                TreeNode *ind=ans.front();ans.pop();
                if(mp[father[ind->val]]==0)mp[father[ind->val]]=1,temp.push(father[ind->val]);
            }
            ans=temp;
        }
        
        return ans.front();
    }
};
相关推荐
smj2302_796826526 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
_深海凉_10 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录10 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
superior tigre13 小时前
78 子集
算法·leetcode·深度优先·回溯
superior tigre15 小时前
739 每日温度
算法·leetcode·职场和发展
6Hzlia15 小时前
【Hot 100 刷题计划】 LeetCode 15. 三数之和 | C++ 排序+双指针
c++·算法·leetcode
北顾笙98017 小时前
day37-数据结构力扣
数据结构·算法·leetcode
6Hzlia19 小时前
【Hot 100 刷题计划】 LeetCode 189. 轮转数组 | C++ 三次反转经典魔法 (O(1) 空间)
c++·算法·leetcode
m0_6294947320 小时前
LeetCode 热题 100-----13.最大子数组和
数据结构·算法·leetcode
田梓燊20 小时前
力扣:94.二叉树的中序遍历
数据结构·算法·leetcode