您好,登錄后才能下訂單哦!
序列化和反序列化一個二叉樹,是很開放的一題,就是給出一個二叉樹,用序列化方法生成一個字符串;然后用反序列化方法把這個字符串生成原來二叉樹。這個在編程時候各個類型一般都有序列化的,用于存儲。
這里面要用到python中l(wèi)ist轉(zhuǎn)化字符串方法 ','.join(list), 和字符串轉(zhuǎn)換為list的方法string.split(',')。
其實可以用之前刷題的幾個題目來組合,比如遍歷二叉樹生成中序和后序兩個隊列,合并為一個隊列,作為序列化方法;然后有一題是按照中序和后序隊列生成二叉樹,就可以作為反序列化的方法使用。當(dāng)然,這樣會有很多冗余數(shù)據(jù)。
其實這個題目比較麻煩的地方就是優(yōu)化,實現(xiàn)倒是很不難。
我這邊用了序列化層級遍歷,就是從根節(jié)點到葉子節(jié)點一層層按照從左到用遍歷,如果某個節(jié)點的左或者右子節(jié)點為空,用#號代替;最后葉子節(jié)點下面會都是”#“號,這里做了個判斷,如果某層都是#號,視作為空,結(jié)束遍歷。
反序列化采用對應(yīng)的方法,這里不多說,看代碼即可。
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Codec: def serialize(self, root): """Encodes a tree to a single string. :type root: TreeNode :rtype: str """ if root != None: checkList = [root] else: checkList = [] AllNodeList = [] while checkList != []: nextList = [] for Node in checkList: if Node != '#': AllNodeList.append(str(Node.val)) if Node.left == None: nextList.append('#') else: nextList.append(Node.left) if Node.right == None: nextList.append('#') else: nextList.append(Node.right) else: AllNodeList.append(Node) if len(set(nextList)) == 1 and '#' in nextList: nextList = [] checkList = nextList return ','.join(AllNodeList) def deserialize(self, data): """Decodes your encoded data to tree. :type data: str :rtype: TreeNode """ if data == '': currentLevel = [] root = None else: AllNodeList = data.split(",") root = TreeNode(int(AllNodeList.pop(0))) currentLevel =[root] while currentLevel != [] and AllNodeList!= []: nextLevel = [] for node in currentLevel: leftValue = AllNodeList.pop(0) if leftValue != '#': node.left = TreeNode(int(leftValue)) nextLevel.append(node.left) rightValue = AllNodeList.pop(0) if rightValue != '#': node.right = TreeNode(int(rightValue)) nextLevel.append(node.right) print([node.val for node in nextLevel]) currentLevel = nextLevel return root # Your Codec object will be instantiated and called as such: # codec = Codec() # codec.deserialize(codec.serialize(root))
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。