二叉树遍历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 指针增加,队列剩余空间会越来越少,造成假溢出(前面还有空间)。

为解决前两个问题,可以采用循环队列,实际上是假定数组是循环。判断队空或队满会出现矛盾,当rearfont 前,既是队空也是队满的表现。因此实现队列的实际大小时可以是默认大小加1,size+1

这种方式可区分队空队满:1、(rear+2) % maxsize = front则 队满,2、(rear+1) % maxsize = front为空 maxsize 为队列长度size+1,rearfont 取值从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的主要内容,如果未能解决你的问题,请参考以下文章

二叉树练习题

二叉树练习题

二叉树的遍历

C语言数据结构“遍历二叉树”

代码随想录算法训练营第15天 | ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

144_二叉树的前序遍历