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

💡【二叉树】包含所有最深节点的最小子树(Python题解 + 图解 + 思路详解)

🧩 题目描述

给定一棵二叉树的根节点 root,每个节点的深度被定义为它到根节点的最短距离。

我们需要返回一棵子树,这棵子树:

  • 包含了二叉树中所有最深的节点
  • 是这些节点的最小子树,也就是说,它是包含这些节点的最浅的公共祖先子树

换句话说,我们的目标是找出:所有最深节点的最近公共祖先(Lowest Common Ancestor, LCA)


🧠 解题分析

1️⃣ 什么是“最深节点”?

树的“深度”从根节点开始计数。根节点深度为 0,它的子节点深度为 1,以此类推。

最深节点指的是那些深度值最大的节点,可能有一个,也可能有多个。

例如:

        3
       / \
      5   1
     /     \
    6       8
           /
          9

最深节点是:69(深度为 3)。我们要找的最小子树,就是它们的最近公共祖先——即根节点 3。


2️⃣ 转换为“最近公共祖先问题

给定一个根为 root 的二叉树,每个节点的深度是 该节点到根的最短距离 。 获得包含原始树中所有 最深节点最小子树,并输出该子树 。 如果一个节点在 整个树 的任意节点具有最大的深度,则该节点最深的 。 一个节点的 子树 是该节点加上它的所有后代的集合。 示例 1: 输入: 11 3 5 1 6 2 0 8 null null 7 4 输出: 2 7 4 解释: 我们返回值为 2 的节点,在图中用黄色标记。 在图中用蓝色标记的是树的最深节点。 注意,节点 5、3 和 2 包含树中最深节点,但节点 2 的子树最小,因此我们返回它。 示例 2: 输入: 1 1 输出: 1 解释:根节点是树中最深节点。 可以使用以下函数输入输出: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(NULL), right(NULL){} TreeNode(int x) : val(x), left(NULL), right(NULL) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} }; TreeNode* inputTree() { int n,count=0; char item[100]; cin>>n; if (n==0) return NULL; cin>>item; TreeNode* root = new TreeNode(atoi(item)); count++; queue<TreeNode*> nodeQueue; nodeQueue.push(root); while (count<n) { TreeNode* node = nodeQueue.front(); nodeQueue.pop(); cin>>item; count++; if (strcmp(item,"null")!=0) { int leftNumber = atoi(item); node->left = new TreeNode(leftNumber); nodeQueue.push(node->left); } if (count==n) break; cin>>item; count++; if (strcmp(item,"null")!=0) { int rightNumber = atoi(item); node->right = new TreeNode(rightNumber); nodeQueue.push(node->right); } } return root; } void levelOrder(TreeNode* root){ if (root == nullptr) { return ; } queue<TreeNode*> Q; Q.push(root); while (!Q.empty()) { int size = Q.size(); for(int i = 0; i < size; i++) { TreeNode* node = Q.front(); Q.pop(); if(node){ cout<<node->val<<" "; }else{ cout<<"null "; continue; } if(!(!node->left&&!node->right)){ Q.push(node->left); Q.push(node->right); } } } } 输入说明 首先输入结点的数目n(注意,这里的结点包括题中的null空结点) 然后输入n个结点的数据,需要填充为空的结点,输入null。 提示: 树中节点的数量在 [1, 500] 范围内。 0 <= Node.val <= 500 每个节点的值都是 独一无二 的。 输出说明 输出结果,需要填充为空的结点,输出null,每个数据的后面跟一个空格。 输入范例 5 0 1 3 null 2 输出范例 2
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值