杭州一名男子被裁员,结果交接时,他竟然转交了七个部门的工作。老板接手后一脸茫然,直接懵了。
裁前看似平平无奇,裁完发现无比重要!这简直就是“裁员的黑洞”呀。
老板以为你只是在做个普通的工作,结果等到你走了,大家才发现,原来你背后担着这么多活儿。
就像我之前也经历过,工作中很多时候你做的事,看似不起眼,但实际上每一个细节都能牵一发而动全身。
你不在了,公司的业务可能就会出问题,甚至会面临倒闭。
说到这,我有个朋友就在裁员大潮中幸存下来,裁了他之后,公司又不停地打电话找他要各种表格模板、对接人、PPT……每个月三四次的频率,简直比当时在岗还要忙。😂
你看,裁到大动脉就是,在你离开后,才发现这些工作没有人能轻松接手。老板才知道,原来你一个人撑起了整个部门。
所以啊,裁员不容易,接手的人更不容易。
这不,前东家的倒闭消息都传来了,想必大家都知道,丢了代码,丢了系统,丢了整条业务线,什么都没了……
算法题:根据二叉树创建字符串
今天我来聊聊一个看似简单,实则耐人寻味的算法题:根据二叉树创建字符串。
题目要求:给定一个二叉树,我们需要生成一个字符串表示这个树。对于每个节点,按照「节点值(左子树)(右子树)」的形式创建字符串。注意,如果某个子树为空,我们要跳过表示,不在字符串中写出“()”,但是如果右子树为空,要特别注意,仍然需要写出“()”。
比如说,给定一颗二叉树:
1
/ \
2 3
/
4
我们需要生成的字符串应该是:"1(2(4))(3)"
这道题最关键的就是如何处理空节点的问题。这个空节点的判断其实是挺有意思的,我们要注意:如果左子树为空而右子树不为空,那一定要显式地表示出来;如果左子树不为空而右子树为空,则右子树部分要表示为空()
。
让我们先来瞧一瞧怎么实现这个算法。我们可以通过递归来解决这个问题,递归的本质就是“对树的每一个节点进行字符串拼接操作”。在递归的过程中,我们会分别检查左子树和右子树的情况,决定是否加括号,最后返回拼接好的字符串。
首先,我们来看代码实现:🧑💻
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class BinaryTreeToString {
public String treeToStr(TreeNode root) {
if (root == null) {
return "";
}
// 获取当前节点的值
String res = String.valueOf(root.val);
// 如果有左子树,需要加上括号
if (root.left != null) {
res += "(" + treeToStr(root.left) + ")";
} else if (root.right != null) {
// 如果没有左子树,但有右子树,仍然要加上"()"表示左子树为空
res += "()";
}
// 如果有右子树,需要加上括号
if (root.right != null) {
res += "(" + treeToStr(root.right) + ")";
}
return res;
}
public static void main(String[] args) {
BinaryTreeToString solution = new BinaryTreeToString();
// 构建示例二叉树
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
System.out.println(solution.treeToStr(root)); // Output: "1(2(4))(3)"
}
}
这里的treeToStr
方法是核心,接下来让我详细讲讲代码的实现逻辑。
递归的终止条件: 我们的递归会在树为空的时候停止,返回空字符串。 节点值的拼接: 每次递归,我们都会把当前节点的值转换为字符串。 左子树的处理: 如果当前节点有左子树,我们就递归计算左子树并加上括号;如果没有左子树但有右子树,我们要加上空的括号“()”。 右子树的处理: 同样地,如果右子树存在,我们就要递归处理右子树并加上括号。
小心空指针的坑
这里我得提醒大家,递归的过程中很容易遇到空指针的问题,特别是在处理左子树或右子树为空的情况下。代码中对每个节点的左、右子树进行了空值检查,保证了不出现空指针错误。
复杂度分析
时间复杂度上,这道题是O(n),因为每个节点都会被访问一次;空间复杂度也是O(n),最坏情况下递归的栈深度会达到树的深度。
你也许会想:“这不就和把树展平一样吗?”嗯,某种程度上是的,但是这里的挑战就在于如何根据子树的有无来决定是否插入括号,这个小小的判断确实让问题变得有趣了。
补充:边界情况
别忘了,边界情况也要处理得当。例如,若二叉树只有一个节点,输出应该是"1"
,没有任何括号;而如果左子树为空,右子树不为空,输出应该是"1()(3)"
,括号不能少。
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。