序列化和反序列化一個(gè)二叉樹,是很開放的一題,就是給出一個(gè)二叉樹,用序列化方法生成一個(gè)字符串;然后用反序列化方法把這個(gè)字符串生成原來二叉樹。這個(gè)在編程時(shí)候各個(gè)類型一般都有序列化的,用于存儲(chǔ)。
創(chuàng)新互聯(lián)的客戶來自各行各業(yè),為了共同目標(biāo),我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領(lǐng)域包括成都做網(wǎng)站、成都網(wǎng)站制作、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺(tái)開發(fā)。這里面要用到python中l(wèi)ist轉(zhuǎn)化字符串方法 ','.join(list), 和字符串轉(zhuǎn)換為list的方法string.split(',')。
其實(shí)可以用之前刷題的幾個(gè)題目來組合,比如遍歷二叉樹生成中序和后序兩個(gè)隊(duì)列,合并為一個(gè)隊(duì)列,作為序列化方法;然后有一題是按照中序和后序隊(duì)列生成二叉樹,就可以作為反序列化的方法使用。當(dāng)然,這樣會(huì)有很多冗余數(shù)據(jù)。
其實(shí)這個(gè)題目比較麻煩的地方就是優(yōu)化,實(shí)現(xiàn)倒是很不難。
我這邊用了序列化層級(jí)遍歷,就是從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)一層層按照從左到用遍歷,如果某個(gè)節(jié)點(diǎn)的左或者右子節(jié)點(diǎn)為空,用#號(hào)代替;最后葉子節(jié)點(diǎn)下面會(huì)都是”#“號(hào),這里做了個(gè)判斷,如果某層都是#號(hào),視作為空,結(jié)束遍歷。
反序列化采用對(duì)應(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))