作为一个程序员,我看到这件事忍不住想吐槽一下。
最近,西安某科技公司领导在工作群里发飙,原因竟然是晚上十点多发的信息没有人回复,结果凌晨二点他大发雷霆,开始在群里一通“输出”。
我只能说,领导,你真的是不懂得照顾员工的情绪啊!工作群里没人回复,是不是可以理解为大家都已经“下班”了呢?别忘了,人家也有私生活,要是把所有时间都贡献给公司,恐怕得被贴上“工作狂”的标签了吧?
领导这种“凌晨两点还骂人”的行为,真的让我想说:你是在加班,还是在给公司挖坑啊?明天早上再说清楚不行吗?有什么问题面对面解决,深夜里这样搞,真的有点过了。
我看到有网友评论说“找个大一点的公司,素质会高一点”,我觉得也没错。
你如果总是“逆来顺受”,可能真的得习惯这样的工作氛围了。但你看看,老板连休息都不放过,看来这公司要么是加班成瘾,要么就是快要崩了,员工连休息的权利都没了,真让人心疼。😓
所以啊,别把自己逼得太紧,工作再忙也得找时间喘口气。
算法题:找树左下角的值
嗨,大家好!今天我们来聊一个经典的算法题:找树左下角的值。
首先,题目给我们的是一棵二叉树,要求我们找出树的左下角的值。也就是我们从树的最底层开始,顺着最左边的路径,最终找到的那个值。说白了,就是这棵树的“最左边的叶子节点”在最底层的值。
问题听起来像是个找树的深度问题,但其实做法不一定要用复杂的递归。我们可以用层序遍历的方式来解决。这是一个典型的广度优先搜索(BFS)问题,结合队列来逐层查找,从最左边开始,遇到的最后一个节点就是我们想要的结果。
解法
我们首先利用队列( queue
)来进行广度优先搜索,逐层扫描树。每一层的最左节点,就是我们需要关注的目标。 我们不断更新队列,直到最后一层,最终找到的就是那个值。
代码示例如下:
from collections import deque
# 二叉树的节点结构
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def findBottomLeftValue(root: TreeNode) -> int:
# 如果树为空,直接返回
if not root:
return None
# 使用队列进行BFS
queue = deque([root])
while queue:
# 当前层的节点数
level_size = len(queue)
# 从队列中拿出所有节点,逐层扫描
for i in range(level_size):
node = queue.popleft()
# 只保留当前层的最左节点
if i == 0:
leftmost_value = node.val
# 把左右子节点加入队列,准备扫描下一层
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return leftmost_value
代码解析
TreeNode类:我们先定义了一个简单的
TreeNode
类来模拟二叉树结构。每个节点有三个属性:值val
、左子节点left
和右子节点right
。findBottomLeftValue函数:
这里我们用队列 queue
来存储当前节点。每次遍历树的当前层时,我们把当前节点的左右子节点加入队列,直到遍历完当前层所有节点。我们只保留当前层的最左节点,即第一个被访问的节点。 每次进入下一层时, leftmost_value
会更新为当前层的最左节点。
返回结果:我们最终返回的就是最后一层的最左节点的值。
举个例子
假设我们有一棵二叉树,如下所示:
1
/ \
2 3
/ \ / \
4 5 6 7
/
8
我们从根节点开始逐层扫描,先看到1,再看到2和3,接着是4、5、6和7,最后是8。最左边的叶子节点就是8,所以返回的结果应该是8。
时间复杂度和空间复杂度
时间复杂度:我们遍历每个节点一次,因此时间复杂度是O(N),其中N是树的节点数。 空间复杂度:由于使用了队列存储节点,最坏情况下空间复杂度也是O(N),例如树的宽度很大时。
小结
这道题的本质是利用层序遍历来找到树的最底层最左边的节点值。使用队列进行BFS非常直观,而且能避免递归深度过深的问题。对于树的深度较大时,BFS在内存上更加高效,避免了递归栈溢出的风险。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。