小黑公司团建吃烤肉肉啦,mac m1死活安装不上hbase,用拯救者一下就安上啦的leetcode之旅:865. 具有所有最深节点的最小子树

这篇博客介绍了三种使用深度优先搜索(DFS)解决二叉树问题的方法,包括两次DFS、一次优先搜索策略。作者在解决算法问题之余,还分享了日常生活,如学习Git的小工具、健康生活习惯、公司团建和饮食记录,以及面对挫折的态度,表达了持续努力的决心。
摘要由CSDN通过智能技术生成

小黑代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def subtreeWithAllDeepest(self, root: TreeNode) -> TreeNode:

        self.max_depth = 0
        self.max_depth_nodes = []
        # 获得结点孩子数组
        def dfs(node, arr):
            if not node:
                return
            arr.append(node)
            dfs(node.left, arr)
            dfs(node.right, arr)
        # 求二叉树每个节点的深度
        def get_depth(node, depth=0):
            if not node:
                return
            depth += 1
            if depth > self.max_depth:
                self.max_depth_nodes = [node]
                self.max_depth = depth
            elif depth == self.max_depth:
                self.max_depth_nodes.append(node)
            
            get_depth(node.left, depth)
            get_depth(node.right, depth)
        get_depth(root)
        self.target_node = None
        # 后跟遍历,求最深公共结点
        def after_dfs(node):
            if not node:
                return
            after_dfs(node.left)
            after_dfs(node.right)
            if self.target_node:
                return
            arr = []
            dfs(node,arr)
            flag = True
            
            for node_ in self.max_depth_nodes:
                if node_ not in arr:
                    # print(node_,arr)
                    flag = False
                    break
            if flag:
                self.target_node = node
        after_dfs(root)
        return self.target_node

在这里插入图片描述

两次深度优先

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def subtreeWithAllDeepest(self, root: TreeNode) -> TreeNode:
        depth_map = {}
        self.max_depth = 0
        def dfs(node, depth):
            if not node:
                return
            depth += 1
            if self.max_depth < depth:
                self.max_depth = depth
            depth_map[node] = depth
            dfs(node.left, depth)
            dfs(node.right, depth)
        # 计算depth_map
        dfs(root, 0)
        # 获取结果
        def result(node):
            if not node:
                return
            # 获取左右子树的包含max_depth的最小子树
            left_node = result(node.left)
            right_node = result(node.right)
            # 结点是最深结点
            if depth_map[node] == self.max_depth:
                return node
            # 左右子树都包含max_depth结点
            if left_node and right_node:
                return node
            if left_node:
                return left_node
            if right_node:
                return right_node
            return None
            
        return result(root)

在这里插入图片描述

一次优先搜索

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def subtreeWithAllDeepest(self, root: TreeNode) -> TreeNode:
        class Result(object):
            def __init__(self, node = None, dist = 0):
                self.node = node
                self.dist = dist
        def dfs(node):
            # 结点不存在
            if not node:
                return Result()
            left_result = dfs(node.left)
            right_result = dfs(node.right)
            # 左子树深的话,返回左子树下最深结点的最小子树
            if left_result.dist > right_result.dist:
                return Result(node=left_result.node, dist=left_result.dist + 1)
            if left_result.dist < right_result.dist:
                return Result(node=right_result.node, dist=right_result.dist + 1)
           
            return Result(node=node, dist=right_result.dist + 1)
        return dfs(root).node

在这里插入图片描述

小黑生活

发现了个学git的小神器

在这里插入图片描述

晚饭外卖

请添加图片描述
在这里插入图片描述

晚上开始哈农的学习

在这里插入图片描述

早餐牛排

在这里插入图片描述

早上运动

在这里插入图片描述

公司团建烤肉肉

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

午餐咖啡&&晚餐

请添加图片描述
请添加图片描述

晚间按摩一个半

在这里插入图片描述

早餐牛排&&跑步

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

午餐+聊天

请添加图片描述
请添加图片描述
请添加图片描述

复试被刷,遭遇了挫折,继续干!!!

在这里插入图片描述

感谢同事们的鼓励,大家一起加油。虽然我现在基础很差,也要干!!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值