二叉树遍历2
Posted ACG哒萌萌沁雪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树遍历2相关的知识,希望对你有一定的参考价值。
二叉树层序遍历
示例:
二叉树:[3,9,20,null,null,15,7]
,
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
队列
迭代法加递归法,迭代法需要用到队列
,首先回顾队列的特性:1、受限制线性表;2、先进先出(FIFO);3、两个指针:rear
指向队列尾部元素,front
指向首部元素;
实际上顺序队列有两个缺点:1. 如果固定前n个位置储存元素,则删除一个元素后面的需要向前移动,操作代价为 Θ(n),2 . 如果不需要维持这个条件,随着font
指针增加,队列剩余空间会越来越少,造成假溢出(前面还有空间)。
为解决前两个问题,可以采用循环队列,实际上是假定数组是循环。判断队空或队满会出现矛盾,当rear
在 font
前,既是队空也是队满的表现。因此实现队列的实际大小时可以是默认大小加1,size+1
。
这种方式可区分队空队满:1、(rear+2) % maxsize = front
则 队满,2、(rear+1) % maxsize = front
为空 maxsize
为队列长度size+1,rear
和 font
取值从0开始。front
初始化为0,即是队首,rear
初始化为maxsize-1
即队列最后元素下标
用python实现的循环队列如下:
class queue():
def __init__(self,size,root):
self.que = []
self.maxSize = size+1
for i in range(maxSize): #我的理解队列是数组,事先分配好一定内存的数组,注意数组预定大小是size+1,之前一直跑不通因为用了size
self.que.append(root)
self.front = 0
self.rear = self.maxSize-1
def enqueue(self,val):
self.que[(self.rear+1) % self.maxSize] = val
self.rear = (self.rear+1) % self.maxSize
def dequeue(self):
temp = self.que[(self.front) % self.maxSize]
self.front = (self.front+1) % self.maxSize
return temp
def isEmpty(self):
if ((self.rear+1) % self.maxSize == self.front):
return True
else:
return False
def isFull(self):
if ((self.rear+2)% self.maxSize == self.front):
return True
else:
return False
def queueSize(self): #计算队列大小
if (self.rear >= self.front):
size = self.rear - self.front + 1
else:
size = self.maxSize - self.front + self.rear + 1
return size
层序遍历:
enqueue root
compute the size of queue
dequeue the roots in the queue, enqueue the left child and right child of each root.
解答:
[1] https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/er-cha-shu-ceng-xu-bian-li-deng-chang-wo-yao-da-sh/ 代码随想录
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
arr = []
Q = queue(140,root)
if (root == None):
return arr
else:
Q.enqueue(root)
while (Q.isEmpty() == False):
element = []
size = Q.queueSize()
for i in range(size):
it = Q.dequeue()
element.append(it.val)
if (it.left != None and not Q.isFull()):
Q.enqueue(it.left)
if (it.right != None and not Q.isFull()):
Q.enqueue(it.right)
arr.append(element)
return arr
实际上python的写法可以非常简洁,队列可以用列表实现,出队直接 pop(0)
,上面重复造轮子,算是复习一遍基本数据结构吧。递归写法
引用某湖南大学老师的总结:
递归出口
递归体
貌似需要计算树高度。算了先这样吧,递归不是一种很好的做法。
旧号新用,不定期发布学习笔记,涵盖数据结构算法,ML,DL, 以及ACG、动漫。旨在督促自己保持学习~ 如有疵漏,欢迎斧正(Hi, stranger. Keep communicating.)
以上是关于二叉树遍历2的主要内容,如果未能解决你的问题,请参考以下文章