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

本文介绍了如何解决寻找具有所有最深结点的最小子树的问题。通过深度优先搜索策略,结合递归过程中记录节点深度,找到最深节点。在递归过程中使用节点引用传递,确保在遍历过程中更新的最深节点信息能够回溯到根节点,最终得到符合条件的子树。此方法在处理二叉树问题时展现出独特的优势。
摘要由CSDN通过智能技术生成

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

难度中等

给定一个根为 root 的二叉树,每个结点的深度是它到根的最短距离。
如果一个结点在整个树的任意结点之间具有最大的深度,则该结点是最深的。
一个结点的子树是该结点加上它的所有后代的集合。
返回能满足“以该结点为根的子树中包含所有最深的结点”这一条件的具有最大深度的结点。

示例:

输入:[3,5,1,6,2,0,8,null,null,7,4]
输出:[2,7,4]
解释:在这里插入图片描述

我们返回值为 2 的结点,在图中用黄色标记。
在图中用蓝色标记的是树的最深的结点。
输入 “[3, 5, 1, 6, 2, 0, 8, null, null, 7, 4]” 是对给定的树的序列化表述。
输出 “[2, 7, 4]” 是对根结点的值为 2 的子树的序列化表述。
输入和输出都具有 TreeNode 类型。

提示:
(1)树中结点的数量介于 1 和 500 之间。
(2)每个结点的值都是独一无二的。

思路1.0(已看题解):

在递归遍历时记录深度,并以此判断最深节点位置,但题解中将最深节点的公共父节点从下往上传递的方法,本菜鸡还是第一次见!

代码1.0(已完成):
  class Solution {
  public:
      int depth(TreeNode* TNode,TreeNode* &saveNode)    //这个TreeNode指针的 引用就很关键
      {
          if (TNode == NULL) return 0;
          TreeNode* leftNode = NULL;
          TreeNode* rightNode = NULL;
          
          int left =1+ depth(TNode->left, leftNode);
          int right =1+ depth(TNode->right, rightNode);
          if (left == right) saveNode = TNode;
          else if (left > right) saveNode = leftNode;
          else if (right > left) saveNode = rightNode;
          return max(left, right);
      }
      TreeNode* subtreeWithAllDeepest(TreeNode* root) {
          TreeNode* rst = NULL;
          depth(root, rst);
          return rst;
      }
  };

对我而言最有价值的就是这个“树节点指针的引用”了,引用传递使得在递归过程中被改变的指针指向也会被返回到调用者手里!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值