九、树及算法-上

本系列博客基于“ (北京大学)数据结构与算法python版”慕课,课程在中国大学慕课和bilibili上均可找到。

1. 内容

  1. 树结构的相关术语
  2. 树的表示方法:嵌套列表,链表
  3. 树的遍历(前序,中序,后序)和应用(表达式解析)
  4. 使用二插堆Binary Heap实现优先队列

2. 课程代码

在GitHub中下载

3. OJ作业

所有代码均可在github中下载

3.1 二叉树复原

题目内容:
   给定一种序列化二叉树的方式:从根节点起始按层次遍历二叉树所有“可能”存在节点的位置:若该位置存在节点,则输出节点值,并在下一层相应增加两个可用位置;否则输出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的对应位置进行了标记):

方法:
用队列来存储树的节点,用左右flag来标记首先将根结点放入队列,每次从队首出列一个结点
   如果此时列表值为none,说明当前节点没有子节点
      如果左右标志均=0,把左标志设为1,表示插入none,结点插回队首
      如果左标志=0右标志=1,把右标志设为1,表示插入none,结点插回队首
   如果此时列表值不为none,说明当前节点有子节点
      如果左右标志=0,把列表值变为当前结点左子树,左标志=1,结点插回队首,左子节点跟在队尾
      如果左=1,右=0,把列表值变为当前结点右子树,右标志=1,结点插回队首,右子节点跟在队尾
因此,队列当中结点的顺序是 a, b…, a.left_child, a.right_child, b.left_child。顺序和逐层遍历一致

class BinaryTree:"""A recursive implementation of Binary TreeUsing links and Nodes approach."""def __init__(self, rootObj):self.key = rootObjself.leftChild = Noneself.rightChild = Noneself.leftFlag = 0  #self.rightFlag = 0  #def seq2tree(seq):# 将列表反序列化为树queue = []  # 队列储存树current_tree = BinaryTree(seq[0])whole_tree = current_treequeue.append(current_tree)i = 1  # 从1开始遍历while i < len(seq) and len(queue) > 0:current_tree = queue.pop(0)if seq[i] == None:  # 当前点没有子节点  相当于是判断current_tree的子节点是否插入if current_tree.leftFlag == 0 and current_tree.rightFlag == 0:  # 当前节点还没插入节点 所以把左flag=1 表示已经插入了nonecurrent_tree.leftFlag = 1queue.insert(0, current_tree)elif current_tree.leftFlag == 1 and current_tree.rightFlag == 0:  # 当前节点已经插入了左子节点 所以把右flag=1 表示已经插入了nonecurrent_tree.rightFlag = 1i = i+1else:if current_tree.leftFlag == 0 and current_tree.rightFlag == 0:  # 左右同时为0 表示还没有插入子树 此处插入左子节点current_tree.leftChild = BinaryTree(seq[i])current_tree.leftFlag = 1queue.append(current_tree.leftChild)queue.insert(0, current_tree)i = i+1elif current_tree.leftFlag == 1 and current_tree.rightFlag == 0:   # 左=1 右=0 插入右子节点current_tree.rightChild = BinaryTree(seq[i])current_tree.rightFlag = 1queue.append(current_tree.rightChild)i = i+1else:i = ireturn whole_treedef inorderTree(root):# 中序遍历树if root == None:return []else:left = inorderTree(root.leftChild)data = root.keyright = inorderTree(root.rightChild)return left+[data]+rightlst = eval(input())
tree = seq2tree(lst)
inorder = inorderTree(tree)
print(' '.join(str(x) for x in inorder))  # 请自行确定打印方式

3.2 翻转二叉树

题目内容:
   给定一个二叉树,请给出它的镜面翻转。为方便起见,本题只给出完全二叉树的层次遍历,请给出相应的翻转二叉树的中序遍历。

输入格式: 一行空格分隔的整数序列,表示一个完全二叉树的层次遍历
输出格式:一行空格分隔的整数序列,表示翻转后的二叉树的中序遍历

输入样例:
4 2 7 1 3 6 9
输出样例:
9 7 6 4 3 2 1

方法:通过3.1的方法将层次二叉树转为二叉树的形式 然后使用 右 中 左 的中序遍历

代码

class BinaryTree:"""A recursive implementation of Binary TreeUsing links and Nodes approach."""def __init__(self,rootObj):self.key = rootObjself.leftChild = Noneself.rightChild = Noneself.leftFlag = 0  #self.rightFlag = 0  #def seq2tree(seq):# 将列表反序列化为树queue = []  # 队列储存树current_tree = BinaryTree(seq[0])whole_tree = current_treequeue.append(current_tree)i = 1  # 从1开始遍历while i < len(seq) and len(queue) > 0:current_tree = queue.pop(0)if seq[i] == None:  # 当前点没有子节点  相当于是判断current_tree的子节点是否插入if current_tree.leftFlag == 0 and current_tree.rightFlag == 0:  # 当前节点还没插入节点 所以把左flag=1 表示已经插入了nonecurrent_tree.leftFlag = 1queue.insert(0, current_tree)elif current_tree.leftFlag == 1 and current_tree.rightFlag == 0:  # 当前节点已经插入了左子节点 所以把右flag=1 表示已经插入了nonecurrent_tree.rightFlag = 1i = i+1else:if current_tree.leftFlag == 0 and current_tree.rightFlag == 0:  # 左右同时为0 表示还没有插入子树 此处插入左子节点current_tree.leftChild = BinaryTree(seq[i])current_tree.leftFlag = 1queue.append(current_tree.leftChild)queue.insert(0, current_tree)i = i+1elif current_tree.leftFlag == 1 and current_tree.rightFlag == 0:   # 左=1 右=0 插入右子节点current_tree.rightChild = BinaryTree(seq[i])current_tree.rightFlag = 1queue.append(current_tree.rightChild)i = i+1else:i = ireturn whole_treedef tranvers_inorder_Tree(root):# 中序遍历树if root == None:return []else:left = tranvers_inorder_Tree(root.leftChild)data = root.keyright = tranvers_inorder_Tree(root.rightChild)return right+[data]+leftlst = list(map(int, input().split()))
tree = seq2tree(lst)
inorder = tranvers_inorder_Tree(tree)
print(' '.join(str(x) for x in inorder))  # 请自行确定打印方式

3.3 多叉树遍历

题目内容:
   给定以嵌套列表形式给出的多叉树,求它的后序遍历
   注:每个代表非空多叉树的列表包含至少一项;列表第一项代表节点值,其后每一项分别为子树;遍历子树时以列表下标从小到大的顺序进行。

输入格式: 一行合法的Python表达式,可解析为嵌套列表形式的多叉树结构
输出格式:一行整数,以空格分隔

输入样例:
[1,[2,[3,[4],[5]],[6]],[7],[8,[9],[10]]]
输出样例:
4 5 3 6 2 7 9 10 8 1

方法:采用递归的方式

代码:

def postorder(lst):if len(lst) == 1:  # 遍历到了页节点return lstelse:ordered_string = []for i in range(1, len(lst)):  # 遍历子节点child = postorder(lst[i])ordered_string = ordered_string+childordered_string.append(lst[0])  # 加入根结点return ordered_stringlst = eval(input())
string = postorder(lst)
print(' '.join(str(x) for x in string))

数据结构与算法python版 MOOC 第九周相关推荐

  1. mooc数据结构与算法python版第十一周作业_中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南...

    中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南 更多相关问题 [判断题]实际集成运放的上限截止频率为无穷大 [多选题]现代城市的发展凸现出与以往不同的动力机制包括 教师在引 ...

  2. 数据结构与算法python版 MOOC 第三周

    三.基本线性结构 本系列博客基于" (北京大学)数据结构与算法python版"慕课,课程在中国大学慕课和bilibili上均可找到. 1. 内容 定义线性结构 讲解栈的结构结构 栈 ...

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

    1 进制转换(10分) 题目内容: 给定一个M进制的数,请将其转换为N进制并输出 输入格式: 两行,第一行为空格分隔的两个数字,分别为10进制表示的M与N:其中M, N均满足2 ≤ M.N ≤ 36 ...

  4. mooc数据结构与算法python版第十周作业_中国大学mooc慕课_数据结构与算法Python版_章节答案...

    新入对于接诊人的院病与查房,中国章节在多必须经治间内进行医师长时. 大学答案高的主要文库日常利用率较有(. 须注下问题:慕课意以,者以知识作为的投资产权出资.在配置上电装,该装装在置(线应部位)的接地 ...

  5. 数据结构与算法Python版MOOC笔记及练习【七】

    文章目录 什么是顺序查找 算法分析 二分查找 冒泡算法思路 插入排序 谢尔排序 归并排序 快速排序 课程练习 什么是顺序查找 数据项保存在像列表这样的集合中,我们会称这些数据项具有线性或者顺序关系. ...

  6. 数据结构与算法Python版-第六周作业

    1. 铺瓷砖(10分) 题目内容: 给定一个长度为N的区域,及4种不同长度的瓷砖:灰瓷砖(长为1格).红瓷砖(长为2格).绿瓷砖(长为3格)与蓝瓷砖(长为4格),求所有不同的铺满整个区域的方法数. 例 ...

  7. 数据结构与算法Python版-第五周作业

    1. 进制转换(10分) 题目内容: 给定一个M进制的数,请将其转换为N进制并输出 输入格式: 两行,第一行为空格分隔的两个数字,分别为10进制表示的M与N:其中M, N均满足2 ≤ M.N ≤ 36 ...

  8. mooc数据结构与算法python版期末测验_中国大学数据结构与算法Python版答案_MOOC慕课章节期末答案...

    中国大学数据结构与算法Python版答案_MOOC慕课章节期末答案 更多相关问题 java.lang 包的 Character 类的 isJavaIdentifierStart 方法的功能是用来判断某 ...

  9. 陈斌老师《数据结构与算法Python版》第五周作业——ASCII谢尔宾斯基地毯

    陈斌老师<数据结构与算法Python版>第五周作业--ASCII谢尔宾斯基地毯 题目 思路 程序如下 总结 题目 谢尔宾斯基地毯是形如上图的正方形分形图案,每个地毯可分为等大小的9份,其中 ...

最新文章

  1. 阿里巴巴持续投入,etcd 正式加入 CNCF
  2. maven命令-P 参数
  3. android 树形目录结构的实现(包含源码)
  4. matlab工程计算及应用 课程名称,《 MATLAB 工程计算及应用》教学大纲课程名称MATLAB 工程计算及应用.pdf...
  5. E - More is better (并查集)
  6. 加入初创企业需要想清楚的几个问题
  7. github上下载别人的vue项目,本地运行
  8. GO语言学习之路19
  9. 帝国的黄昏:SQL是世界上最牛逼的语言
  10. Laya Shader3D之边缘光照
  11. 锐浪HTML5报表实际应用方法,解决锐浪Grid++报表在谷歌等浏览器不兼容的尴尬局面
  12. 聚沙成塔——VBA术语 (VBA Glossary)
  13. [ElementPlus] 多标签页切换
  14. 全志平台WiFi无法连接AP问题调试(1)问题分析
  15. mysql开发收银_农银e管家收银台PC版收款语音播报插件开发实录(二)
  16. C语言笔记-进制转换
  17. 值得推荐的几部日本电影(一)
  18. zynq7000 创建fsbl工程,并打开log
  19. 修改数组相应位置元素——splice()
  20. linux删除文件后没有释放空间

热门文章

  1. 网站运营SEO笔记:网赚圈,最近网站被攻击的有点猛!
  2. PHP 使用 Guzzle 执行 HTTP 请求
  3. java redis 断线重连_redis断线重连代码详解
  4. 解决:“[INS-06006] Passwordless SSH connectivity not set up” 报错
  5. from sklearn.cross_validation import train_test_split发生报错
  6. UE发起的PDU Session Establishment流程详解(1)
  7. 南瓜科学新品上线 开辟益智玩具新世界
  8. HTML学习记录二:html标签(五):超链接标签
  9. autohotkey 常见语法
  10. Python-同一个类两个函数间变量的调用