题解 | #序列化二叉树#

序列化二叉树

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
全部评论

相关推荐

3 收藏 评论
分享
牛客网
牛客企业服务