序列化和反序列化一个二叉树,是很开放的一题,就是给出一个二叉树,用序列化方法生成一个字符串,然后用反序列化方法把这个字符串生成原来二叉树。这个在编程时候各个类型一般都有序列化的,用于存储。
这里面要用转到python中列表化字符串方法& # 39;,& # 39;. join(列表),和字符串转换为列表的方法string.split (& # 39; & # 39;)。
其实可以用之前刷题的几个题目来组合,比如遍历二叉树生成中序和后序两个队列,合并为一个队列,作为序列化方法,然后有一题是按照中序和后序队列生成二叉树,就可以作为反序列化的方法使用。当然,这样会有很多冗余数据。
其实这个题目比较麻烦的地方就是优化,实现倒是很不难。
我这边用了序列化层级遍历,就是从根节点到叶子节点一层层按照从左到用遍历,如果某个节点的左或者右子节点为空,用#号代替;最后叶子节点下面会都是“#”号,这里做了个判断,如果某层都是#号,视作为空,结束遍历。
反序列化采用对应的方法,这里不多说,看代码即可。
#, Definition for  a binary tree 节点。 #,class TreeNode(对象): #,,,,,def __init__(自我,,x): #,,,,,,,,,self.val =, x #,,,,,,,,,self.left =,没有 #,,,,,,,,,self.right =,没有 class 编码: ,,,def 序列化(自我,,根): ,,,,,,,“““Encodes a tree 用a single 字符串。 ,,,,,,, ,,,,,,,:type 根:TreeNode ,,,,,,,:rtype: str ,,,,,,,,,, ,,,,,,,if root !=,没有: ,,,,,,,,,,,checkList =,(根) ,,,,,,,其他的: ,,,,,,,,,,,checkList =, [] ,,,,,,,AllNodeList =, [] ,,,,,,,while checkList !=, []: ,,,,,,,,,,,nextList =, [] ,,,,,,,,,,,for Node 拷贝清单: ,,,,,,,,,,,,,,,if Node !=, & # 39; # & # 39;: ,,,,,,,,,,,,,,,,,,,AllNodeList.append (str (Node.val)) ,,,,,,,,,,,,,,,,,,,if Node.left ==,没有: ,,,,,,,,,,,,,,,,,,,,,,,nextList.append (& # 39; # & # 39;) ,,,,,,,,,,,,,,,,,,,其他的: ,,,,,,,,,,,,,,,,,,,,,,,nextList.append (Node.left) ,,,,,,,,,,,,,,,,,,,if Node.right ==,没有: ,,,,,,,,,,,,,,,,,,,,,,,nextList.append (& # 39; # & # 39;) ,,,,,,,,,,,,,,,,,,,其他的: ,,,,,,,,,,,,,,,,,,,,,,,nextList.append (Node.right) ,,,,,,,,,,,,,,,其他的: ,,,,,,,,,,,,,,,,,,,AllNodeList.append(节点) ,,,,,,,,,,,if len(设置(nextList)),==, 1,以及& # 39;# & # 39;,拷贝nextList: ,,,,,,,,,,,,,,,nextList =, [] ,,,,,,,,,,,checkList =nextList ,,,,,,,return & # 39; & # 39; . join (AllNodeList) ,,,,,,, ,,,def 反序列化(自我,,数据): ,,,,,,,“““Decodes your encoded data 用树。 ,,,,,,, ,,,,,,,:type 数据:str ,,,,,,,:rtype: TreeNode ,,,,,,,,,, ,,,,,,,if data ==, & # 39; & # 39;: ,,,,,,,,,,,currentLevel =, [] null null null null null null null null null null null null null null null null null null null null null null null刷题系列——序列化和反序列化一个二叉树