【二叉树】根据二叉树创建字符串

0x00 题目

给你一棵二叉树,使用 前序 遍历的方式
将这个它转换成一个由 括号整数 组成的字符串

节点则用一对空括号 () 表示
而且你需要省略所有不影响字符串
与原始二叉树之间的一对一映射关系的空括号对

粟子 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)”

和第一个示例相似
但不能省略第一个对括号


0x01 思路

在遍历子树前,添加左括号 (
遍历子树
在遍历子树后,添加右括号 )

这样就能把节点放在括号里面了

左子树为空,右子树不为空时
左括号 可以省略,添加判断即可


0x02 解法

语言:Swift

树节点:TreeNode

public class TreeNode {
    public var val: Int
    public var left: TreeNode?
    public var right: TreeNode?
    public init() { self.val = 0; self.left = nil; self.right = nil; }
    public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
    public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
        self.val = val
        self.left = left
        self.right = right
    }
}

方法
把遍历的结果,先放在 数组 里面,最后再生成 字符串

func tree2str(_ t: TreeNode?) -> String {
    guard let t = t else {
        return ""
    }
    
    // 存放结果
    var array = [String]()
    
    func dfs(_ t: TreeNode?) {
        guard let t = t else {
            return
        }
        
        // 添加当前节点
        array.append("\(t.val)")
        
        // 左子树不为空时
        if t.left != nil {
            // 添加左括号
            array.append("(")
            
            // 递归遍历下一个节点
            dfs(t.left)
            
            // 添加右括号
            array.append(")")
        }
        
        // 右子树不为空时
        if t.right != nil {
            // 左子树不为空时,左括号不能省略
            if t.left == nil {
                array.append("()")
            }
            
            // 添加左括号
            array.append("(")
            
            // 递归遍历下一个节点
            dfs(t.right)
            
            // 添加右括号
            array.append(")")
        }
    }
    
    dfs(t)
    return array.joined()
}

方法
直接使用一个 字符串,在遍历的同时进行拼接
逻辑跟上面的方法一致,把 数组 的添加变成了 字符串 的拼接

func tree2str(_ t: TreeNode?) -> String {
    guard let t = t else {
        return ""
    }
    
    var out = ""
    
    func dfs(_ t: TreeNode?) {
        guard let t = t else {
            return
        }
        
        out += "\(t.val)"
        
        if t.left != nil {
            out += "("
            dfs(t.left)
            out += ")"
        }
        
        if t.right != nil {
            if t.left == nil {
                out += "()"
            }
            out += "("
            dfs(t.right)
            out += ")"
        }
    }
    
    dfs(t)
    
    return out
}

小五笔

86版,98版,二选一
当然,你可以全都要~
请添加图片描述


猜你喜欢

转载自blog.csdn.net/xjh093/article/details/121784088