一位大厂员工吐槽了公司领导的做法:领导习惯性地在晚上10点钟通过公司群聊发布工作消息,虽然很多员工都已经看过了消息,但碍于时间已晚,大家选择了“已读不回”,希望能在第二天再做回复。

然而,凌晨2点,领导突然在群里发火,表示无法理解为什么大家不回应信息,并直接威胁道:“搞不明白就离职,以后‘已读不回’一律按旷工处理。”
员工们并非不重视工作,而是对合理的工作与休息时间有着基本的需求和期待。在信息爆炸的时代,如何平衡工作与生活、提升沟通效率,成为了现代职场管理者亟需解决的重要课题。
面试题:二叉树的右视图
站在右边看一棵树,能看到哪些节点?这题看着像层序遍历的入门题,真写起来,很多人第一反应还是递归一路往右钻。结果一上手就错:右视图不是“右边那条链”,而是每一层最后看到的那个节点。这两个概念差得还挺远。像这种题,我第一眼一般不急着写 DFS,先把“层”这个信息抓稳,不然代码写着写着就会把题意写歪。
先说判断:既然题目问“右视图”,本质就是每层取一个值。那最顺手的就是层序遍历。队列里一层一层出,当前层最后一个节点,直接塞进结果集,结束。
Java 实现如下,够短也不拧巴:
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null) {
return ans;
}
Deque<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while (!queue.isEmpty()) {
int levelSize = queue.size();
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
if (i == levelSize - 1) {
ans.add(node.val);
}
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return ans;
}
}
比如这棵树:
1
/ \
2 3
\ \
5 4
第一层看到 1,第二层看到 3,第三层看到 4,所以答案是 [1,3,4]。
这题也能用 DFS 做,而且 DFS 更像是“先看右边,右边没了再看左边”。关键点不是递归本身,而是第一次到达某个深度时,那个节点就是这一层从右边看到的节点。所以递归顺序必须先右后左,这地方一改,结果就变味了。
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ans = new ArrayList<>();
dfs(root, 0, ans);
return ans;
}
private void dfs(TreeNode node, int depth, List<Integer> ans) {
if (node == null) {
return;
}
if (depth == ans.size()) {
ans.add(node.val);
}
dfs(node.right, depth + 1, ans);
dfs(node.left, depth + 1, ans);
}
}
真要选的话,面试里更愿意先写 BFS。原因很简单:题目明着按层拿结果,层序遍历不容易解释偏,也不容易把“右视图”误写成“右子树优先遍历结果”。
这题难点不在代码量,在于别把观察角度理解错。树题经常这样,代码就十几行,想偏了能调半天。
|