We love coding - #3

2023/03/08閱讀時間約 4 分鐘
Hi, I'm coding dog!
Q: 給定一個二元樹的根節點,請實現一個函數 serialize(root),將該樹序列化為一個字符串,以及函數 deserialize(s),將該字符串反序列化回一棵二元樹。
例如,給定以下節點類別:
class Node:
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
以下測試應該通過:
node = Node("root", Node("left", Node("left.left")), Node("right"))
assert deserialize(serialize(node)).left.left.val == "left.left"

A: 序列化的過程可以通過對樹進行先序遍歷來實現,並將每個節點表示為一個字符串,其格式為 "val,left_subtree,right_subtree"。我們可以使用一個特殊字符 "#" 來表示空節點。例如,上面的樹可以序列化為字符串 "root,left,left.left,#,#,#,right,#,#"。
反序列化的過程可以通過遞歸來實現。我們首先將輸入字符串拆分為一個節點值列表,然後使用第一個值創建一個新節點,並使用其餘值遞歸構建其左右子樹。為了跟蹤輸入列表中的當前位置,我們可以使用一個指針在遞歸中傳遞。
以下是 serializedeserialize 函數的實現:
class Node:
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def serialize(root):
    if not root:
        return "#"
    left_serialized = serialize(root.left)
    right_serialized = serialize(root.right)
    return f"{root.val},{left_serialized},{right_serialized}"
def deserialize_helper(nodes):
    if nodes[0] == "#":
        nodes.pop(0)
        return None
    val = nodes.pop(0)
    node = Node(val)
    node.left = deserialize_helper(nodes)
    node.right = deserialize_helper(nodes)
    return node
def deserialize(s):
    nodes = s.split(",")
    root = deserialize_helper(nodes)
    return root
我們可以使用提供的示例進行測試:
node = Node("root", Node("left", Node("left.left")), Node("right"))
assert deserialize(serialize(node)).left.left.val == "left.left"
這個測試應該通過。
CodingDog
CodingDog
留言0
查看全部
發表第一個留言支持創作者!
從 Google News 追蹤更多 vocus 的最新精選內容