MOOC数据结构与算法Python版-第九周编程作业第一题

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'))

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值