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

1 二叉树复原(10分)

题目内容:

给定一种序列化二叉树的方式:从根节点起始按层次遍历二叉树所有“可能”存在节点的位置:若该位置存在节点,则输出节点值,并在下一层相应增加两个可用位置;否则输出None,且不增加下一层的可用位置。

例如"[5, 4, 7, 3, None, 2, None, -1, None, 9]"是下图所示的二叉树序列化的结果:

MOOC数据结构与算法Python版-第九周编程作业_第1张图片

其中红色箭头对所有的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的对应位置进行了标记):

MOOC数据结构与算法Python版-第九周编程作业_第2张图片

 

参考代码模板:

 

  1. def seq2tree(seq):
  2.     # 将列表反序列化为树
  3.     pass
  4.  
  5. def inorderTree(root):
  6.     # 中序遍历树
  7.     pass
  8.  
  9. lst = eval(input())
  10. tree = seq2tree(lst)
  11. inorder = inorderTree(tree)
  12. print(inorder) # 请自行确定打印方式

程序代码:

class BinTree:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
        self.leftfuck = 0
        self.rightfuck = 0


def seq2tree(seq):
    queue = []
    i = 1
    currentTree = BinTree(seq[0])
    finaltree = currentTree
    queue.append(currentTree)
    while i < len(seq) and len(queue) > 0:
        currentTree = queue.pop(0)
        if seq[i] == None:
            if currentTree.leftfuck == 0 and currentTree.rightfuck == 0:
                currentTree.leftfuck = 1
                queue.insert(0, currentTree)
            elif currentTree.leftfuck == 1 and currentTree.rightfuck == 0:
                currentTree.rightfuck = 1
            i = i + 1

        else:
            if currentTree.leftfuck == 0 and currentTree.rightfuck == 0:
                currentTree.leftfuck = 1
                currentTree.left = BinTree(seq[i])
                queue.append(currentTree.left)
                queue.insert(0, currentTree)  
                i = i + 1
            elif currentTree.leftfuck == 1 and currentTree.rightfuck == 0:
                currentTree.rightfuck = 1
                currentTree.right = BinTree(seq[i])
                queue.append(currentTree.right)
                i = i + 1
            else:
                i = i
    return finaltree


def inorderTree(root):
    if root == None:
        return []
    else:
        left = inorderTree(root.left)
        data = root.data
        right = inorderTree(root.right)
        return left + [data] + right


lst = eval(input())
tree = seq2tree(lst)
inorder = inorderTree(tree)
print(' '.join(str(x) for x in inorder))

2 翻转二叉树(10分)

题目内容:

给定一个二叉树,请给出它的镜面翻转。

为方便起见,本题只给出完全二叉树的层次遍历,请给出相应的翻转二叉树的中序遍历。

 

备注:

这个问题来自开源软件开发者Max Howell在Google面试被拒的经历 :

 

  1. 谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了

 

输入格式:

一行空格分隔的整数序列,表示一个完全二叉树的层次遍历

 

输出格式:

一行空格分隔的整数序列,表示翻转后的二叉树的中序遍历

 

输入样例:

4 2 7 1 3 6 9

 

输出样例:

9 7 6 4 3 2 1

时间限制:500ms内存限制:32000kb

程序代码:

lst =list(input().split())
lst = [0] + lst
for i in range(2, len(lst)):  # 将lst正则化,即转换成‘完全二叉树’式的非嵌套列表,使None的子节点都是None
     if lst[i // 2] == None:  # 如果这个元素的父节点是None,那么这个元素不能连在这里,所以把它右移
          if i == len(lst) - 1:  # 分两种情况,如果是最后一个元素的话,那么他右移要超出list的下标了,所以list先扩充一格
               lst = lst + [None]  # lst加一格
               lst.insert(i + 2, lst[i])  # 将此时的元素插入到后两格的位置
               lst[i] = None  # 然后把原来的位置变成None
          else:  # 如果不是最后一个元素的话,直接在后两格的位置insert就行
               lst.insert(i + 2, lst[i])
               lst[i] = None
# 递归实现中序遍历
result = []


def inorderTree(root):  # (root是根节点的下标)
     if root * 2 <= len(lst) - 1:  # 如果有左子树的话
          inorderTree(root * 2)  # 遍历左子树
     if lst[root] != None:  # 将根节点保存到result列表中(如果不是None的话)
          result.append(lst[root])
     if root * 2 + 1 <= len(lst) - 1:  # 如果有右子树的话
          inorderTree(root * 2 + 1)  # 遍历右子树


inorderTree(1)
print(' '.join(str(x) for x in result[::-1]))

 睡觉睡觉下午上课.....

 

 

 

你可能感兴趣的:(Python,数据结构)