LeetCode 606
2020.8.15
我的通过代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
String str = "";
public String tree2str(TreeNode t) {
traverse(t);
return str;
}
void traverse(TreeNode t) {
if(t==null) return;
if("".equals(str)) {
str+=t.val;
if(t.left==null&t.right==null) return;
if(t.left==null) str+="()";
traverse(t.left);
traverse(t.right);
} else if(t.left==null&&t.right!=null) {
str+="(";
str+=t.val;
str+="()";
traverse(t.right);
str+=")";
} else {
str+="(";
str+=t.val;
traverse(t.left);
traverse(t.right);
str+=")";
}
}
}
还是突出一个暴力。
这道题并不难,但是我考虑问题实在是太不全面了,漏掉了比较特殊的情况,导致提交了三次才通过。
一个是根节点没有左子树的情况,那么左边必须要有一组括号来表示左子树为空,这一点我没想到。
另一个是只有根节点,就整棵树只有这么一个节点。对刚刚那种情况的修改不够泛用,没包含这种情况,导致程序运行结果出错。
还是要多思考思考可能出现的问题。
官方题解
可能出现的的情况:
-
如果当前节点有两个孩子,那我们在递归时,需要在两个孩子的结果外都加上一层括号;
-
如果当前节点没有孩子,那我们不需要在节点后面加上任何括号;
-
如果当前节点只有左孩子,那我们在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号;
-
如果当前节点只有右孩子,那我们在递归时,需要先加上一层空的括号 () 表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。
官方代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public String tree2str(TreeNode t) {
if(t==null)
return "";
if(t.left==null && t.right==null)
return t.val+"";
if(t.right==null)
return t.val+"("+tree2str(t.left)+")";
return t.val+"("+tree2str(t.left)+")("+tree2str(t.right)+")";
}
}
上述官方题解转自LeetCode。
链接:https://leetcode-cn.com/problems/construct-string-from-binary-tree/solution/gen-ju-er-cha-shu-chuang-jian-zi-fu-chuan-by-leetc/