数据结构—第五章(二叉树)概念与遍历

1.定义(知识大纲)

知识总览:

 定义;二叉树是一种特殊的树形结构,其特点是每个结点至多只有两颗字树(即二叉树种不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。

细小知识点:

区分二叉树和度为二的树(我之前也没有认真区分,是根据看书,发现的):

度为2的树至少有3个结点,而二叉树可以为空。

度为2的有序树的孩子的左右次序是相对于另一个孩子而言,某一个结点只有一个孩子,则这个孩子就无须区分其左右次序。而二叉树无论孩子数是否为2,均需确定其左右次序,即二叉树的结点次序不是相对于另一个结点而言的,而是确定的。

注:这个区分有点无聊,看看就行。

2.二叉树的种类

  • 二叉树:每个结点的度均不大于2的有序树。
  • 斜树:所有结点都只有左子树的二叉树叫左斜树,所有结点都只有右子树的二叉树叫右斜树。统称为斜树。
  • 满二叉树:所有分支结点(非终端结点)都有左右子树,且所有叶子结点(终端结点)在同一层次的二叉树。
  • 完全二叉树:对于一棵具有n个结点的二叉树按层序编号,如果编号为i(1≤i≤n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵树为完全二叉树。 (直观解释:除了最后一层外其他层都是满二叉树的二叉树,且最后一层的结点从左往右按顺序分布。

对应的性质:

完全二叉树

1.只有最后两层可能有叶子结点。

2.最多只有一个度为1的结点。

注:这两个性质经常考,特别是完全二叉树度为1的可能有,可能没有,这时候就与度的最大和最小值挂钩。

 
 二叉排序树

平衡二叉树 

后面几个,在以后的章节会重点提及的,虽然在二叉树这个章节看上去没有怎么提及,后面会呼应的,可以后面重点学习,这一章,知道这个概念就可以了。 

3.二叉树的性质

 上面是文字直接说明,下面是对应的图片。

            

图片说明:(复习的时候先看上图,上图的文字叙述的有点模糊就看下面图片,不模糊就直接过,节省时间)。 

完全二叉树考察:

 

4.二叉树的存储结构

 二叉树分为顺序存储和链式存储

注:这这个知识点,直接会看视频是最高效的复习策略。我一轮的时候也是只把概念弄清,可能深度不够,二轮要把整个过程弄清。

定义:

  • 顺序储存结构: 用数组自上而下,自左至右储存完全二叉树上的结点元素,0号单元储存根结点。一般二叉树数组中一些位置填0表示不存在此结点,会占用不必要空间。故数组一般只用来存储完全二叉树。
  • 链式储存结构:由二叉树的定义可知,链表中的结点数据项包括数据域和左、右指针域。链表的头指针指向根结点,这样的链表又称为二叉链表。如果需要方便找一个结点的父结点,可以定义一个三叉链表额外储存结点的父结点指针域。

注:特别是哪些适用于顺序存储,哪些适用于链式存储,自己这方面一轮的时候没有注意,导致错题,比较多。

考题:顺序存储 ,又要满足任意性,就必须以满二叉树计算。

 5.二叉树的遍历

注(复习策略):知识点就定义,很多是通过题型的(条件),进行改变。

对于线性表遍历的顺序是一条直线,对于二叉树遍历需要遵循某种关系。遍历后其实就是把树中的结点变成某种有意义的线性序列,用于程序实现。
遍历二叉树:按某条搜索路径巡访树中的每个结点,使每个结点均只被访问一次。

  • 前序遍历:若二叉树为空,则空操作1.访问根结点 2.前序遍历左子树 3.前序遍历右子树
  • 中序遍历:若二叉树为空,则空操作1.中序遍历左子树 2.访问根结点 3.中序遍历右子树
  • 后序遍历:若二叉树为空,则空操作1.后序遍历左子树 2.后序遍历右子树 3.访问根结点
  • 层序遍历:若二叉树为空,则空操作,从树的第一层从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问

 

注:递归和非递归在一轮的时候,没有很仔细的区别和实践,在二轮的时候,一定要注意这个知识点,将之前遗漏的捞一下。

常考的结论:

注(考题):喜欢考只只给前序和后序推有那几种可能。 

里面算最难的几个题目(与栈结合)

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二叉树的层次遍历主要是通过队列实现的,具体步骤如下: 1. 首先将二叉树的根节点入队列; 2. 当队列不为空时,依次将队头节点出队列,并将其左右子节点入队列; 3. 重复步骤2,直到队列为空。 这样就可以按照层次顺序遍历整棵二叉树了。以下是示例代码实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def levelOrder(root: TreeNode) -> List[List[int]]: if not root: return [] res = [] # 存储遍历结果 queue = [root] # 初始化队列 while queue: level = [] # 存储当前层次的节点值 for i in range(len(queue)): node = queue.pop(0) # 出队列 level.append(node.val) if node.left: queue.append(node.left) # 左子节点入队列 if node.right: queue.append(node.right) # 右子节点入队列 res.append(level) return res ``` 这段代码中,我们使用了一个列表 `res` 存储层次遍历的结果,使用一个列表 `queue` 存储每一层的节点。在每一层的遍历中,我们依次将队头节点出队列,并将其左右子节点入队列,并将节点值存储到 `level` 列表中,最后将 `level` 列表添加到 `res` 列表中。最终返回 `res` 列表即可。 ### 回答2: 层次遍历二叉树是一种广度优先的遍历方式,它按照树的层次从上到下、从左到右的顺序遍历二叉树的每个节点。 具体的层次遍历过程如下: 1. 首先,我们需要一个辅助数据结构,通常可以选择队列(Queue)来实现。将根节点入队。 2. 进入循环,循环条件是队列不为空。 3. 在循环中,首先将队首节点出队,并对这个节点进行操作,例如打印节点的值。 4. 然后,将这个节点的左子节点和右子节点依次入队(如果存在的话)。 5. 循环回到第2步,直到队列为空。这样就完成了整个二叉树的层次遍历。 层次遍历二叉树的时间复杂度为O(n),其中n为二叉树的节点个数。层次遍历适用于需要按层级处理二叉树节点的场景,例如分层打印二叉树或者求二叉树的最小高度等问题。 总结起来,层次遍历二叉树是一种基于队列的遍历方式,按照从上到下、从左到右的顺序遍历二叉树的每个节点,可以很方便地处理树的层级相关问题。 ### 回答3: 层次遍历二叉树是一种广度优先搜索的方式,它按照每一层从左到右的顺序遍历二叉树的节点。 具体的遍历过程如下: 1. 首先创建一个队列用于存储待遍历的节点。 2. 将二叉树的根节点入队。 3. 循环执行以下操作,直到队列为空: a) 弹出队首节点,并访问该节点。 b) 若该节点有左子节点,则将左子节点入队。 c) 若该节点有右子节点,则将右子节点入队。 4. 遍历结束。 层次遍历二叉树的优点是能够按照从上到下、从左到右的顺序逐层遍历节点,更加符合我们直观的观察习惯。在一些问题中,层次遍历的结果更容易分析和处理。 例如,对于以下二叉树: A / \ B C / \ \ D E F 层次遍历的结果为:A, B, C, D, E, F。 首先将根节点A入队,然后依次访问A、B、C,并将其子节点B、C入队。接着弹出队首节点B,访问B,并将其左子节点D、右子节点E入队。再弹出队首节点C,访问C,并将其右子节点F入队。最后依次弹出队列中的节点并访问,得到层次遍历的结果。 层次遍历二叉树可以使用队列这一数据结构来实现,时间复杂度为O(n),其中n为二叉树节点的个数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值