1二叉树复原(10分)
题目内容:
给定一种序列化二叉树的方式:从根节点起始按层次遍历二叉树所有“可能”存在节点的位置:若该位置存在节点,则输出节点值,并在下一层相应增加两个可用位置;否则输出None,且不增加下一层的可用位置。
例如"[5, 4, 7, 3, None, 2, None, -1, None, 9]"是下图所示的二叉树序列化的结果:
其中红色箭头对所有的None进行了标记。
现给出一个二叉树以这种形式序列化的结果,请复原该二叉树并给出它的中序遍历。
输入格式:
一行合法的Python表达式,可解析为包含整数与None的列表
输出格式:
二叉树中序遍历的整数序列,以空格分隔
输入样例:
[5, 4, 7, 3, None, 2, None, -1, None, 9]
输出样例:
-1 3 4 5 9 2 7
输入样例2:
[5,1,4,None,None,3,6]
输出样例2:
1 5 3 4 6
注:树结构如图(红色箭头对None的对应位置进行了标记):
思路:找了好多得代码,他们的思路基本是将列表反序列化为树,在进行中序遍历,代码好长注释也少看起来好复杂,感觉自己写不出来。。。偶然发现另一个思路,将二叉树尽量补全为完全二叉树,再进行遍历。提出改思路文章地址:添加链接描述
# 将二叉树补全二叉树,最后一个可以作为父节点得节点为None,想补全但是没想出来
# 最后就没补,跑代码发现结果没影响。。
def complitTree(tree):
tree = ['0']+tree
i = 1
while 2*i+1 <= len(tree):
if tree[i] == 'None':
tree.insert(2*i, 'None')
tree.insert(2*i+1, 'None')
else:
# 这里主要是补类似输入[5, 4, 7, 3, None, 2, None, -1, None, 9]中倒数第二个
# 可做父节点得节点得儿子
if tree[2*i] is not None:
if 2*i+1 > len(tree)-1:
tree.insert(2*i+1, 'None')
i += 1
return tree
# 中序遍历
def inorder(tree, root, result):
if root*2 <= len(tree)-1:
inorder(tree, root*2, result)
if tree[root]:
result.append(tree[root])
if root*2+1 <= len(tree)-1:
inorder(tree, root*2+1, result)
return result
lst = eval(input())
for i in range(len(lst)):
lst[i] = str(lst[i])
result = []
lst = complitTree(lst)
inorder(lst, 1, result)
print(" ".join(i for i in result if i != 'None'))