题解 | #序列化二叉树#

序列化二叉树

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

相关推荐

06-25 09:33
厦门大学 Java
程序员饺子:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司7个岗位
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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