求:
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 1:
输入: 二叉树: [1,2,3,4]
1
/ \
2 3
/
4
输出: "1(2(4))(3)"
解释: 原本将是“1(2(4)())(3())”,
在你省略所有不必要的空括号对之后,
它将是“1(2(4))(3)”。
示例 2:
输入: 二叉树: [1,2,3,null,4]
1
/ \
2 3
\
4
输出: "1(2()(4))(3)"
解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
解:
由于C字符串处理相对复杂,此处直接使用Java提供的字符串轮子。本题重点是先序遍历,这意味着先对当前节点进行操作,再递归调用左右子树。如果当前节点为空,返回空字符串。如果当前节点非空但左右子树均为空,返回当前节点的值。如果当前的左子树或者右子树为空,根据题意,在左子树不空,右子树为空的情况下,可以不打印右子树的()字符串。因此我们对这种情况特殊处理,返回当前节点值和(左子树字符串的拼接结果)。对一般情况(左右子树都有),返回当前节点值+(左子树字符串的拼接结果)+(右子树字符串的拼接结果)。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
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) +
")"
;
}
}
来源:oschina
链接:https://my.oschina.net/u/4469818/blog/4289465