二叉树层次遍历python_Python 二叉树的层序建立与三种遍历实现详解

前言

二叉树(Binary Tree)时数据结构中一个非常重要的结构,其具有。。。。(此处省略好多字)。。。。等的优良特点。

之前在刷LeetCode的时候把有关树的题目全部跳过了,(ORZ:我这种连数据结构都不会的人刷j8Leetcode啊!!!)

所以 !!!敲黑板了!!!今天我就在B站看了数据结构中关于树的内容后,又用我浅薄的Python大法来实现一些树的建立和遍历。

关于树的建立我觉得层序建立对于使用者来说最为直观,输入很好写。(好吧,我是看LeetCode中的树输入都是采用层序输入觉得非常好)

树节点定义

代码来

class BSTreeNode(object):

def __init__(self, data):

self.val = data

self.leftChild = None

self.rightChild = None

这一段代码太好理解了好吧,就不BB了。

二叉树层序建立

不多说,先上代码

# 建立二叉树是以层序遍历方式输入,节点不存在时以 'None' 表示

def creatTree(nodeList):

if nodeList[0] == None:

return None

head = BSTreeNode(nodeList[0])

Nodes = [head]

j = 1

for node in Nodes:

if node != None:

node.leftChild = (BSTreeNode(nodeList[j]) if nodeList[j] != None else None)

Nodes.append(node.leftChild)

j += 1

if j == len(nodeList):

return head

node.rightChild = (BSTreeNode(nodeList[j])if nodeList[j] != None else None)

j += 1

Nodes.append(node.rightChild)

if j == len(nodeList):

return head

creatTree即为层序建立二叉树的函数,传入的参数为一个层序遍历的数组,就是将树节点从左往右,从上往下一次放入数组中,如果某个节点不存在则用None来表示。

比如:

201972991321301.png?201962991415

图所示的二叉树则需输入a = [1,2,3,4,5,None,6,None,None,7,8],接下来将会以这个二叉树为例讲解代码。

第3-4行,判断根节点是否为空。 如果根节点都为空,那树(shuo)就(ge)不(j)存(8)在了,直接返回就好了。

第5行,将元素列表中的第一个元素取出新建根节点,最后返回的即为根节点

第6行,创建了一个Nodes列表中,用于存放树中的节点,每生成一个节点就将其放入该列表中,可以看成是一个队列(这么说好像也不是特别规范,因为后面只是取列表中的元素,没有弹出首元素),此处将根节点存入。

第7行,创建变量j用于nodeList中元素的索引,初始为1.因为第0个元素已经创建根节点了。

第8行,依次取出Nodes列表中的节点,对其创建左子节点和右子节点

第9行,首先判断取出的Nodes是否为空,如果为空,说明此处没有节点,就无需创建子节点,否则进行子节点的创建

第10行,为该节点创建左节点,其值就是索引j的所对应的值,如果nodeLists[j] == None 说明没有该子节点,就不用创建了,即Child = None

第11行,将新建的节点加入Nodes数组,使其在for循环中可以继续为其添加子节点

第12行,j加1,这样刚好使每一个nodeList的元素对应一个节点了

第13行,判断j的值,如果与nodeList值相等说明全部节点已经添加完毕了,直接返回head根节点就完成了树的建立

第15-19行,为节点添加右节点,与添加左节点的逻辑是一样的,就不在赘述了

好了代码注释完毕,我们再通过结合实例来解释一下:

201972991321301.png?201962991415

nodeList = [1,2,3,4,5,None,6,None,None,7,8],下面节点统一用n(值)来表示

建立根节点 head = n(1), j=1, len(nodeList) = 11

开始for循环:Nodes = [n(1)]

node为n(1),非空

nodeList[j]=nodeList[1]=2 非空,所以新建节点n(2),n(1)的左节点即为n(2),新建节点放入Nodes, 则Nodes=[n(1),n(2)] j+1=2, j未溢出

nodeList[j]=nodeList[2]=3 非空,所以新建节点n(3),n(1)的右节点即为n(3),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3)], 然后j+1=3, j未溢出

node为n(2),非空

nodeList[j]=nodeList[3]=4 非空,所以新建节点n(4),n(2)的左节点即为n(4),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4)], j+1=4, j未溢出

nodeList[j]=nodeList[4]=5 非空,所以新建节点n(5),n(2)的右节点即为n(5),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5)], j+1=5, j未溢出

node为n(3),非空

nodeList[j]=nodeList[5]=None 为空,所以n(3)的左节点直接等于None, 同时将None也放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None] j+1=6, j未溢出

nodeList[j]=nodeList[6]=6 非空,所以新建节点n(6),n(3)的右节点即为n(6),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6)], j+1=7, j未溢出

node为n(4),非空

nodeList[j]=nodeList[7]=None 为空,所以n(4)的左节点直接等于None,同时将None也放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None], j+1=8, j未溢出

nodeList[j]=nodeList[8]=None 为空,所以n(4)的右节点直接等于None,同时将None也放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None], j+1=9, j未溢出

node为n(5), 非空

nodeList[j]=nodeList[9]=7 非空,所以新建节点n(7),n(5)的左节点即为n(7),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None,n(9)] j+1=10, j未溢出

nodeList[j]=nodeList[10]=8 非空,所以新建节点n(8),n(5)的右节点即为n(8),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None,n(9),n(10)] j+1=11, j溢出

j溢出,则返回head根节点,结束二叉树的建立

PS:如果node为空节点的话,就会直接跳过空节点。

二叉树遍历(神用的递归)

1. 前序遍历

#head为二叉树的根节点

def PreorderTraverse(head):

if head:

print(head.val)

PreorderTraverse(head.leftChild)

PreorderTraverse(head.rightChild)

2. 中序遍历

#head为二叉树的根节点

def InorderTrverse(head):

if head:

InorderTrverse(head.leftChild)

print(head.val)

InorderTrverse(head.rightChild)

3. 后续遍历

#head为二叉树的根节点

def PostorderTraverse(head):

if head:

PostorderTraverse(head.leftChild)

PostorderTraverse(head.rightChild)

print(head.val)

对中序遍历,费了我九牛二虎之力画了一个程序执行的图,红色箭头代表程序执行的过程,依然以a = [1,2,3,4,5,None,6,None,None,7,8]为例

201972991321303.png?201962991415

这个图看上去不是很清楚,右键保存到本地看会清楚很多的,我把每一步递归的树都画出来了,这样更加方便理解。

所以程序打印出来的顺序为:4 2 7 5 8 1 3 6

最后,致敬大佬,祝各位学有所成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: Python 二叉树的层序建立与三种遍历实现详解

本文地址: http://www.cppcns.com/jiaoben/python/267002.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是二叉树层序遍历Python实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def levelOrder(root): """ :type root: TreeNode :rtype: List[List[int]] """ # 如果根节点为空,则返回空列表 if not root: return [] # 初始化结果列表和队列,将根节点加入队列中 result = [] queue = [root] # 循环遍历队列,直到队列为空 while queue: # 获取当前队列的长度,即当前层的节点个数 level_len = len(queue) level_vals = [] # 遍历当前层的所有节点 for i in range(level_len): # 弹出队列中的节点,并将其值添加到当前层的值列表中 node = queue.pop(0) level_vals.append(node.val) # 如果当前节点有左子节点,则将其加入队列中 if node.left: queue.append(node.left) # 如果当前节点有右子节点,则将其加入队列中 if node.right: queue.append(node.right) # 将当前层的值列表添加到结果列表中 result.append(level_vals) # 返回结果列表 return result ``` 在上述实现中,我们使用了一个队列来存储遍历过程中的节点。我们首先将根节点加入队列中,然后循环遍历队列,每次弹出队列中的一个节点,并将其左右子节点加入队列中。我们还需要记录当前层的节点个数,以便在遍历完当前层时,能够开始遍历下一层。在遍历完所有层后,我们将所有层的值列表添加到结果列表中,最终返回结果列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值