题解 | #序列化二叉树#

序列化二叉树

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
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
03-03 19:02
已编辑
东华理工大学 Node.js
点赞 评论 收藏
分享
找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务