用递归和非递归方法实现二叉树的前序、中序、后序遍历以及层序遍历
2023-12-14 00:52:08
递归方法实现:
class BTree:
def __init__(self, value):
self.root = value
self.left = None
self.right = None
#前序遍历:中左右
def preorder(self):
if self.root:
print(self.root, end=' ')
if self.left:
self.left.preorder()
if self.right:
self.right.preorder()
#中序遍历:左中右
def inorder(self):
if self.left:
self.left.inorder()
if self.root:
print(self.root, end=" ")
if self.right:
self.right.inorder()
#后序遍历:左右中
def postorder(self):
if self.left:
self.left.postorder()
if self.right:
self.right.postorder()
if self.root:
print(self.root, end=" ")
#层序遍历
def levelorder(self):
level_order = []
if self.root:
level_order.append([self])
height = self.height()
if height >= 1:
for _ in range(2, height + 1):
level = []
for node in level_order[-1]:
if node.left:
level.append(node.left)
if node.right:
level.append(node.right)
if level:
level_order.append(level)
for i in range(0, height):
for index in range(len(level_order[i])):
level_order[i][index] = level_order[i][index].root
return level_order
#设置高度
def height(self):
if self.root is None:
return 0
elif self.left is None and self.right is None:
return 1
elif self.left is None and self.right:
return 1 + self.right.height()
elif self.left and self.right is None:
return 1 + self.left.height()
else:
return 1 + max(self.left.height(), self.right.height())
#对树的叶子进行遍历
def leaves(self):
if self.root is None:
return
elif self.left is None and self.right is None:
print(self.root, end=' ')
elif self.left is None and self.right:
self.right.leaves()
elif self.right is None and self.left:
self.left.leaves()
else:
self.left.leaves()
self.right.leaves()
非递归方法实现:
class TreeNode:
def __init__(self, x, L=None, R=None):
self.val = x
self.left = L
self.right = R
#前序遍历:根左右
class Solution:
def preordder(self,root):
temp=[root]
dp=[]
while temp:
tmp=temp.pop()
dp.append(tmp.val)
if tmp.right:
temp.append(tmp.right)
if tmp.left:
temp.append(tmp.left)
return dp
#中序遍历:左根右:
'''先定义两个空列表,
设置变量存储根节点,再对定义的空列表和当前变量进行遍历,将第一个空列表用来存储根节点,然后返回到左节点,定义变量=第一个列表删除的元素
第二个元素用来存储当前的删除的节点值,设置变量将其传给当前根节点的右孩子,最后返回遍历的数据列表
'''
class Solution1:
def middleorder(self,root):
stack=[]
res=[]
r=root
while stack or r:
if r:
stack.append(r)
r=r.left
else:
node=stack.pop()
res.append(node.val)
r=node.right
return res
#后序遍历:左右根:
'''
先设置两个空数组用于后续读取和设置遍历的节点,
先将根节点传给其中一个数组进行存储
设置一个循环,其中设置变量等于根节点中弹出的一个元素,
并在另一个空数组中添加当前弹出元素的节点
后走到左孩子,将根节点树的左孩子传给第一个数组,并且添加进去
随后看右孩子,再将右孩子添加到第一个数组
最后将该结果返回到第二个空数组即可
'''
class Solution2:
def backorder(self,root):
dp1=[root]
dp2=[]
while dp1:
cur=dp1.pop()
dp2.append(cur.val)
if cur.left:
dp1.append(cur.left)
if cur.right:
dp1.append(cur.right)
return dp2[-1]
#层序遍历:对每层元素开始遍历
'''
先设置空的数组,将根节点添加一个数组中方便后续遍历
设置while循环对每层进行遍历,将每层的节点元素弹出后存入一个空的数组,
最后将每层的元素进行遍历和存储
'''
class Solution3:
def levelbianli(self,root):
outlist1=[]
outlist2=[]
outlist1.append(root)
while outlist1:
res=[]
i=0
temp=outlist1.pop(0)
res.append(temp.val)
nums=len(outlist1)
while i<nums:
p=outlist1.pop(0)
res.append(p.val)
if p.left:
outlist1.append(p.left)
if p.right:
outlist1.append(p.right)
i+=1
outlist2.append(res)
return outlist2
文章来源:https://blog.csdn.net/m0_74396770/article/details/134859901
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!