剑指offer-顺序打印二叉树节点(系列)-树-python
转载自 https://blog.csdn.net/u010005281/article/details/79761056 非常感谢!
首先创建二叉树,然后按各种方式打印:
class treeNode:
def __init__(self, x):
self.left = None
self.right = None
self.val = x class Solution: # 给定二叉树的前序遍历和中序遍历,获得该二叉树
def getBSTwithPreTin(self, pre, tin):
if not pre or not tin:
return None
root = treeNode(pre[0])
for order, item in enumerate(tin):
if root.val == item:
root.left = self.getBSTwithPreTin(pre[1:order + 1], tin[:order])
root.right = self.getBSTwithPreTin(pre[order + 1:], tin[order + 1:])
return root #从上往下打印出二叉树的每个节点,同层节点从左至右打印
#使用队列先进先出来依次打印
def PrintFromTopToBottom(self, root):
array = []
result = []
if root == None:
return result
#root为根,其值为根节点的值
array.append(root)
while array:
newNode = array.pop(0)
result.append(newNode.val)
if newNode.left != None:
array.append(newNode.left)#先放左边
if newNode.right != None:
array.append(newNode.right)
return result #从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
def Print(self, pRoot):
if not pRoot:
return []
resultList = []
curLayer = [pRoot]
count = 0
while curLayer:
curList = []
nextLayer = []
for node in curLayer:
curList.append(node.val)
if node.left:
nextLayer.append(node.left)
if node.right:
nextLayer.append(node.right)
if count // 2 == 0:
curList.reverse()
resultList.append(curList)
curLayer = nextLayer return resultList #请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
#第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 #方式1:
#1. 按序获取每一层节点的值;
# 2. 将偶数层节点的值倒序。
def PrintZ_1(self, pRoot):
# write code here
if pRoot == None:
return []
cur_layer = [pRoot]
res = []
isEvenLayer = True
while cur_layer:
curlist = []
nextlayer = []
isEvenLayer = not isEvenLayer #是否倒叙
for node in cur_layer:
curlist.append(node.val)
if node.left:
nextlayer.append(node.left)
if node.right:
nextlayer.append(node.right)
if isEvenLayer == False:
res.append(curlist)
else:
res.append(curlist[::-1])
cur_layer = nextlayer
return res #方式2:
# 获取每一层的节点的值时,如果是偶数层,则将每个节点的值插入到列表的头部,
# 即实现了获取节点值时如果是偶数层则倒序排列的效果:
def PrintZ_2(self, pRoot):
# write code here
if pRoot == None:
return []
cur_layer = [pRoot]
res = []
isEvenLayer = True
while cur_layer:
curlist = []
nextlayer = []
isEvenLayer = not isEvenLayer # 是否倒叙
for node in cur_layer:
if isEvenLayer == False:
curlist.append(node.val)
else:
curlist.insert(0,node.val) if node.left:
nextlayer.append(node.left)
if node.right:
nextlayer.append(node.right)
res.append(curlist)
cur_layer = nextlayer
return res if __name__ == '__main__':
# flag = "printTreeNode"
# flag = "printTreeNode_line"
# flag = "printTreeNode_Z1"
flag = "printTreeNode_Z2"
solution = Solution()
preorder_seq = [1, 2, 4, 7, 3, 5, 6, 8]
middleorder_seq = [4, 7, 2, 1, 5, 3, 8, 6]
treeRoot1 = solution.getBSTwithPreTin(preorder_seq, middleorder_seq)
if flag == "printTreeNode":
newArray = solution.PrintFromTopToBottom(treeRoot1)
print(newArray)
elif flag == "printTreeNode_line":
newArray = solution.Print(treeRoot1)
print(newArray)
elif flag == "printTreeNode_Z1":
newArray = solution.PrintZ_1(treeRoot1)
print(newArray)
else:
newArray = solution.PrintZ_2(treeRoot1)
print(newArray)

剑指offer-顺序打印二叉树节点(系列)-树-python的更多相关文章
- 【剑指Offer】序列化二叉树 解题报告(Python)
[剑指Offer]序列化二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 【剑指Offer】按之字形顺序打印二叉树 解题报告(Python)
[剑指Offer]按之字形顺序打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- 【剑指Offer】把二叉树打印成多行 解题报告(Python)
[剑指Offer]把二叉树打印成多行 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 剑指Offer:重建二叉树【7】
剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5 ...
- 剑指offer——已知二叉树的先序和中序排列,重构二叉树
这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2, ...
- 《剑指offer》重建二叉树
本题来自<剑指offer> 重构二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2 ...
- 剑指 Offer 68 - II. 二叉树的最近公共祖先 + 最近公共祖先(LCA)
剑指 Offer 68 - II. 二叉树的最近公共祖先 Offer_68_2 题目详情 题解分析 java代码 package com.walegarrett.offer; /** * @Autho ...
- 力扣 - 剑指 Offer 37. 序列化二叉树
目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样 ...
- 剑指 Offer 68 - II. 二叉树的最近公共祖先
剑指 Offer 68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近 ...
随机推荐
- html aside标签 语法
html aside标签 语法 aside是什么意思? aside为语义化标签,通常用来描述与文档主体内容不相关的内容,其aside标签的内容应该与附近的内容相关. 作用:定义其所处内容之外的内容.直 ...
- Quartz监听器
1.概念Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.TriggerLi ...
- Selenium 多窗口切换
我们在操作网页的时候,点击有些页面的链接,会重新打开一个窗口,我们要在新页面上操作,就得切换窗口 比如在百度首页的登录框点击注册,会重新打开一个注册的新页面,要在新页面注册,就得先切进新页面 那我们怎 ...
- 当SQL Server出现当 MUST_CHANGE 为 ON (开)时
取消账号强制策略时出现错误 当 MUST_CHANGE 为 ON (开)时,不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关). (Microsoft S ...
- Prometheus 后续杂记
在后续prometheus的使用中遇到的一些问题我会在此记录 搭建初期几个问题 rule.yml中对每条告警加上主机名? 要在告警通知中加上故障机器主机名不能从prometheus的采集监控项数据中的 ...
- Windows操作系统Apache服务器下配置PHP
在Apache web服务器上发布PHP项目之前,需要进行相应的配置,服务器才能解析php文本,正常显示php动态页面内容.在进行php配置之前默认已经在Windows系统下安装好了Apache服务器 ...
- 20165218 《网络对抗技术》 Exp9 网络安全基础
Exp9 网络完全基础 基础问题回答 SQL注入攻击原理,如何防御 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. ...
- centos64位编译32位程序
test.c #include <stdio.h> int main() { printf("sizeof long is %d\n",sizeof(long)); ; ...
- a标签点击,页面自动刷新
<a href="javascript:void(0)" id="reDiagnosis" class="checkBtn"oncli ...
- jQuery file upload上传图片出错分析
以https://github.com/blueimp/jQuery-File-Upload/blob/master/basic-plus.html为例 注释掉load-image.all.min.j ...