题解 | #序列化二叉树#

序列化二叉树

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

时间损耗方面,超过99%的python提交代码 主要使用层次遍历的方式,空节点采用值为-1的节点代替,若一层节点的值均为-1则认为该层不存在。构造树采用了递归的方法,除了判断该节点是否在列表中存在外,通过判断节点的值是否为-1决定是否继续递归构造其子树。

from typing import List


class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def Serialize(self, root):
        # write code here
        if not root:
            return None
        resstr = []
        nodeduilie = [root]
        deep = 1
        while True:
            count = 2 ** (deep - 1)
            # 利用值为-1的节点标记空的位置
            # flag 用来标记一层至少有一个节点,不然就终止
            flag = 0
            for i in range(count):
                tempnode = nodeduilie.pop(0)
                resstr.append(tempnode.val)
                if tempnode.left and tempnode.left.val != -1:
                    nodeduilie.append(tempnode.left)
                    flag = 1
                else:
                    nodeduilie.append(TreeNode(-1))
                if tempnode.right and tempnode.right.val != -1:
                    nodeduilie.append(tempnode.right)
                    flag = 1
                else:
                    nodeduilie.append(TreeNode(-1))
            # flag标志着下一层,是否有真实的节点
            if flag == 0:
                break
            # 标志下次循环的是第几层的节点,用于计算一层的节点数
            deep += 1
        return resstr

    def Deserialize(self, s):
        # write code here
        if not s:
            return None
        root = TreeNode(s[0])

        return self.buildtree(root, s, 0)

    def buildtree(self, root: TreeNode, alist: List[int], n):
        # 根节点是列表中的第n个,它的左孩子则是第2n + 1个,右孩子为第2n+2个
        if 2 * n + 1 > len(alist) - 1:
            return root
        if alist[2 * n + 1] != -1:
            root.left = TreeNode(alist[2 * n + 1])
            root.left = self.buildtree(root.left, alist, 2 * n + 1)
        else:
            root.left = None
        if 2 * n + 2 > len(alist) - 1:
            return root
        if alist[2 * n + 2] != -1:
            root.right = TreeNode(alist[2 * n + 2])
            root.right = self.buildtree(root.right, alist, 2 * n + 2)
        else:
            root.right = None

        return root
全部评论

相关推荐

02-14 12:40
门头沟学院 Java
程序员花海:1.面试要求必须Java笔试不一定 2.难度对等秋招 远超于日常实习是因为同一批次且转正很多 竞争压力大 3.第一个加点指标,上线了就把接口性能加上去 使用本地缓存这个不算亮点 只是技术选型,要把为什么采用这个和背后的思考写出来而不是单纯堆叠技术没意义 4.八股要一直看 很容易忘记 5.拼团交易这个老问题 堆积技术 另外建议你把奖项合并到教育背景 没必要拆出来放最后
我的简历长这样
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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