题解 | #序列化二叉树#

序列化二叉树

https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84

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

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param root TreeNode类 
     * @return TreeNode类
     */
    // 规定使用,分割节点,空字符串null表示
    // 规定使用,分割节点,空字符串null表示
    func Serialize ( _ root: TreeNode?) -> String {
        // 层序遍历
        if root == nil {
            return ""
        }
        var arr = [Int?]()
        var queue = [TreeNode?]()
        arr.append(root!.val)
        queue.append(root)
        while !queue.isEmpty {
            var size = queue.count
            while size > 0 {
               let node:TreeNode? = queue.removeFirst() ?? nil
               if (node != nil) {
                   queue.append(node?.left)
                   queue.append(node?.right)
                   arr.append(node?.left?.val)
                   arr.append(node?.right?.val)
               }
               size = size - 1
            }
        }
        for index in (0 ... arr.count - 1).reversed() {
            if arr[index] == nil {
                arr.remove(at: index)
            } else {
                break
            }
        }
        let strArr:[String] = arr.map {
            if $0 == nil {
                return "#"
            } else {
                return String($0 ?? 0)
            }
        }
        let res = strArr.joined(separator: ",")
        return res
    }
    
    func Deserialize ( _ str: String) -> TreeNode? {
        if str.count == 0 { return nil }
        var arr:[Int?] = str.components(separatedBy: ",").map {
            if $0 == "#" {
                return nil
            } else {
                return Int($0)
            }
        }
        if arr.count == 0 || arr.first == nil {
            return nil
        }
        var queue = [TreeNode?]()
        let firstNode = TreeNode(arr.removeFirst()!)
        queue.append(firstNode)
        while !queue.isEmpty && !arr.isEmpty {
           var size = queue.count
            while size > 0 {
               let node = queue.removeFirst()
               size = size - 1
               if node != nil {
                   if arr.count <= 0 {
                       break
                   }
                   let left = arr.removeFirst()
                   if left != nil {
                       node?.left = TreeNode(left!)
                       queue.append(node?.left)
                   }
                   if arr.count <= 0 {
                       break
                   }
                   let right = arr.removeFirst()
                   if right != nil {
                       node?.right = TreeNode(right!)
                       queue.append(node?.right)
                   }
               }
           }
        }
        return firstNode
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务