题目概述(简单难度)
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 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)" 解释: 和第一个示例相似, 除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
题目链接:
点我进入leetcode
思路与代码
思路展现
思路如下:
1:当一个结点的左子树和右子树都为空的时候直接结束
2:当一个结点的左子树为空,右子树不为空,则加上()
3:当一个结点的左子树不为空,就先加上(,然后把其所有左子树递归完毕后,加上)
4:当一个结点的右子树为空,且左子树遍历完毕,直接return
5:当一个结点的左子树遍历完毕,且右子树不为空,就先加上(,然后遍历右子树,最后再加上)。
代码示例
class Solution { public void tree2strChild(TreeNode root,StringBuilder sb) { if(root == null){ return; } //先把根节点加进去 sb.append(root.val); //此处只考虑左右的左子树 if(root.left == null) { if(root.right == null) { //左右都为空直接结束 return; }else { //适用于左树为空,右树不为空的情况 sb.append("()"); } //else代表考虑左树不为空的情况 }else { //左树不为空的时候先放一个( sb.append("("); //然后把所有左子树递归完毕 tree2strChild(root.left,sb); //所有左子树递归完毕后加入) sb.append(")"); } //然后在考虑所有右子树 //假设此时右子树为空 if(root.right == null) { //右子树为空就直接return return; }else { //右子树不为空的话仍然是先加上( sb.append("("); //然后开始吧所有右子树递归完毕 tree2strChild(root.right,sb); //所有右子树递归完毕后再加上) sb.append(")"); } } public String tree2str(TreeNode root) { if(root == null) { return null; } StringBuilder sb = new StringBuilder(); tree2strChild(root,sb); return sb.toString(); } }
时间复杂度:O(N),其中 N 是二叉树中的节点数目。
空间复杂度:O(N),在最坏情况下,会递归 N 层,需要 O(N) 的栈空间。
总结
这道题目还是有点难度的,适用于扩展,同学们可以好好学习下.