劍指 Offer 【37】. 序列化二叉樹

題目:

思路+代碼:

思路:
1.序列化,採用層序遍歷;這裏添加null節點操作,是判斷節點是否爲空添加,所以res確實有多添加null
2.反序列化:先構建根節點,遍歷有效的節點val,每次pop一個節點就添加它的左右節點;

class Codec:

    def serialize(self, root):
        """Encodes a tree to a single string.
        
        :type root: TreeNode
        :rtype: str
        """
        if not root: return "[]"
        res, node_list = [], []
        node_list.append(root)
        while node_list:
            layer_list = []
            node = node_list.pop(0)
            if node:
                res.append(str(node.val))
                layer_list.append(node.left)
                layer_list.append(node.right)
            else:
                res.append("null")

            node_list.extend(layer_list)

        return '[' + ','.join(res) + ']'
        

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        if data == '[]':
            return
        print(data)
        vals = data[1:-1].split(',') # 不包括兩個中括號以逗號分割
        print(vals)
        node_ls = []
        root = TreeNode(int(vals[0])) # 根節點
        node_ls.append(root)
        i = 1
        while node_ls:
            node = node_ls.pop(0)
            print(i)
            if vals[i] != 'null':
                node.left = TreeNode(int(vals[i]))
                node_ls.append(node.left)
            i +=1
            if vals[i] != 'null':
                node.right = TreeNode(int(vals[i]))
                node_ls.append(node.right)
            i +=1
        return root

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章