python二叉树常用算法总结
作者:我是一颗大西瓜 发布时间:2023-01-15 01:35:18
标签:python,二叉树,算法
1.1 二叉树的初始化
#initial of BinaryTree
class BinaryTree:
def __init__(self,rootObj):
self.val = rootObj
self.left = None
self.right = None
def insertLeft(self,newNode):
if self.left == None:
self.left = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.left = self.left
self.left = t
def insertRight(self,newNode):
if self.right == None:
self.right = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.right = self.right
self.right = t
1.2 创建一个二叉树
#create a BinaryTree [18,7,11,3,4,5,6,#,#,#,#,1,3,2,4]
# 18
# 7 11
#3 4 5 6
# 1 3 2 4
root = BinaryTree(18)
root.left = BinaryTree(7)
root.right = BinaryTree(11)
root.left.left = BinaryTree(3)
root.left.right = BinaryTree(4)
root.right.left = BinaryTree(5)
root.right.right = BinaryTree(6)
root.right.left.left = BinaryTree(1)
root.right.left.right = BinaryTree(3)
root.right.right.left = BinaryTree(2)
root.right.right.right = BinaryTree(4)
1.3 前序遍历
#递归版本
def PreOrder(self, node):
if node:
print(node.val)
self.PreOrder(node.left)
self.PreOrder(node.right)
#循环版本
def PreOrderLoop(self, node):
if node == None:
return
stack =[]
print(node.val)
stack.append(node)
node = node.left
while stack!=[] or node:
while node:
print(node.val)
stack.append(node)
node = node.left
node = stack[-1].right
stack.pop()
#ouput: 18 7 3 4 11 5 1 3 6 2 4
1.4 中序遍历
#递归版本
def InOrder(self, node):
if node:
self.InOrder(node.left)
print(node.val)
self.InOrder(node.right)
#循环版本
def InOrderLoop(self, node):
if node == None:
return None
stack = []
stack.append(node)
node = node.left
while stack!=[] or node:
while node:
stack.append(node)
node = node.left
print(stack[-1].val)
node = stack[-1].right
stack.pop()
#output:3 7 4 18 1 5 3 11 2 6 4
1.5 后序遍历
#递归
def PostOrder(self, node):
if node:
self.PostOrder(node.left)
self.PostOrder(node.right)
print(node.val)
#非递归
def PostOrderLoop(self, node):
if node == None:
return
stack =[]
stack.append(node)
pre = None
while stack!=[]:
node = stack[-1]
if ((node.left==None and node.right==None) or
(pre and (pre == node.left or pre ==node.right))):
print(node.val)
pre = node
stack.pop()
else:
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
#output:3 4 7 1 3 5 2 4 6 11 18
1.6 层序遍历
def LevelOrder(self, node):
if node == None:
return
stack = []
stack.append(node)
while stack!=[]:
node = stack[0]
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
print(node.val)
stack.pop(0)
output: 18 7 11 3 4 5 6 1 3 2 4
1.7 计算节点数
#递归版本
def CountNode(self, root):
if root == None:
return 0
return self.CountNode(root.left) + self.CountNode(root.right) + 1
#非递归版本
def CountNodeNotRev(self, root):
if root == None:
return 0
stack = []
stack.append(root)
index = 0
while index<len(stack):
if stack[index].left:
stack.append(stack[index].left)
if stack[index].right:
stack.append(stack[index].right)
index += 1
print(len(stack))
output: 11
1.8 计算树的深度
def getTreeDepth(self, root):
if root == None:
return 0
left = self.getTreeDepth(root.left) + 1
right = self.getTreeDepth(root.right) + 1
return left if left>right else right
1.9 计算树的叶子树
def countLeaves(self, root):
if root == None:
return 0
if root.left==None and root.right==None:
return 1
return self.countLeaves(root.left)+self.countLeaves(root.right)
1.10 获取第K层节点数
def getKLevel(self, root, K):
if root == None: return 0
if K == 1: return 1
return self.getKLevel(root.left, K-1)+self.getKLevel(root.right, K-1)
1.11 判断两颗二叉树是否相同
def StrucCmp(self, root1, root2):
if root1 == None and root2 == None: return True
elif root1 ==None or root2 == None: return False
return self.StrucCmp(root1.left, root2.left) and self.StrucCmp(root1.right, root2.right)
1.12 二叉树的镜像
def Mirror(self, root):
if root == None: return
tmp = root.left
root.left = root.right
root.right = tmp
self.Mirror(root.left)
self.Mirror(root.right)
1.13 找最低公共祖先节点
def findLCA(self, root, node1, node2):
if root == None: return
if root == node1 or root == node2: return root
left = self.findLCA(root.left, node1, node2)
right = self.findLCA(root.right, node1, node2)
if left and right:
return root
return left if left else right
1.14 获取两个节点的距离
def getDist(self, root, node1, node2):
lca = self.findLCA(root, node1, node2) #找最低公共祖宗节点
level1 = self.FindLevel(lca, node1) #祖节点到两个节点的距离
level2 = self.FindLevel(lca, node2)
return level1+level2
def FindLevel(self, node, target):
if node == None: return -1
if node == target: return 0
level = self.FindLevel(node.left, target)
if level == -1: level = self.FindLevel(node.right, target)
if level != -1: return level + 1
return -1
1.15 找一个节点的所有祖宗节点
def findAllAncestor(self, root, target):
if root == None: return False
if root == target: return True
if self.findAllAncestor(root.left, target) or self.findAllAncestor(root.right, target):
print(root.val)
return True
return False
来源:https://bbs.huaweicloud.com/blogs/254847
0
投稿
猜你喜欢
- python上传时,包含boundary时的处理方式 img_url = [] upload_pic_url = &
- 一.Numpy库1.什么是numpy?numpy是python进行科学计算的一个基础软件包,他是一个python库,提供多维数组
- 在Python探索之SocketServer详解中我们介绍了Python标准库中的SocketServer模块,了解了要实现网络通信服务,就
- 该章节我们学习虚拟环境的相关知识,虚拟环境对于刚刚使用Python的初学者来说使用的概率可能会比较低。但是我们依然要对它有一定的了解。认识虚
- 引子使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:<!DOCTYPE HTML>&l
- 数据库索引是一个数据结构,提高操作的速度,在一个表中可以使用一个或多个列,提供两个快速随机查找和高效的顺序访问记录的基础创建索引。在创建索引
- 本文实例为大家分享了pygame实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下由于这段时间实在是太聊了,没什么事做,游戏也玩腻了,所以
- 本文实例讲述了python复制文件的方法。分享给大家供大家参考。具体分析如下:这里涉及Python复制文件在实际操作方案中的实际应用以及Py
- 简洁的隐藏垂直菜单在hover时将内容展开。这样的效果在JS里有很多个版本,但这个可以说是绝无仅有的CSS版本。此菜单可以在IE5.5,IE
- python入门细节相除后的类型type(2/2)floattype(2//2)int双斜杠是整除,出来的类型是int。单斜杠的出来的是fl
- 你需要添加两个按钮:一个按钮使所有英雄都可以死亡,而另一个按钮使所有英雄永生。由于它会影响所有英雄,而与选择无关,因此这需要一个单独的按钮,
- Timeloop是一个库,可用于运行多周期任务。这是一个简单的库,使用decorator模式在线程中运行标记函数。首先安装timeloop库
- juypter notebook中直接使用log_device_placement=True打印不出来device信息# Creates a
- 前言网站登录的时候我们常常会看到随机的验证码需要输入后台验证,如图:现在我们来实现在Django中通过自定制插件来实现随机验证check_c
- 1、time模块(※※※※)import time #导入时间模块print(time.time()) #返回当前时间的时间戳,可用于计算程
- 翻译整理:Young.J;官方网站:http://jquery.comjQuery是一款同prototype一样优秀js开发库类,特别是对c
- 我生平不爱学习,所以说不出什么洋洋洒洒的大道理,貌似也写不出妙语连珠的学术文章,有感于现在宅到极致的生活状态,故一篇图文并茂的文章诞生了(大
- 有时在我们注册账户、登陆系统时,当所有验证通过方可提交 这就需要Jquery来实现表单验证,今天分享给小伙伴们一段基于Jquery实现表单验
- 介绍Addit 是一个Python模块,除了提供标准的字典语法外,Addit 生成的字典的值既可以使用属性来获取,也可以使用属性进行设置。这
- 现象:生产中心进行拷机任务下了300个任务,过了一阵时间后发现任务不再被调度起来,查看后台日志发现日志输出停在某个时间点。分析:1、首先确认