前言
本文带你走进二叉树,二叉树是我们学习中一个非常重要的内容,同时二叉树的内容篇幅也会比较长,所以这里分开向大家介绍。本文首先向大家介绍二叉树的理论知识,后续将会向大家讲解具体的题目。本文用于记录自己的学习过程,同时向大家进行分享相关的内容。本文内容参考于代码随想录同时包含了自己的许多学习思考过程,如果有错误的地方欢迎批评指正!
什么是二叉树
说到二叉树,我们首先应该知道树。树就是由根节点和其子节点构成的数据结构的形式。如图左边的就是树,其可以由多个子节点,因其形状像树,所以命名为树。其实二叉树就是树的一种特殊形式,如右图所示,二叉树每个节点最多只有两个子节点。所以我们通常叫其子节点为左右子节点。
二叉树的种类
满二叉树
首先了解概念,当一个二叉树其只有度为0或者度为2的子节点,并且其度为零的子节点全部在同一层的时候,那么其就是满二叉树。什么是度,就是该节点的子节点的个数称为度。当满二叉树的深度为k时,其子节点的个数为 2 k − 1 2^k-1 2k−1。如图所示:
完全二叉树
首先看概念:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1)个节点。一定要理解就是是按顺序一个个的,只有最后一层可能没填满。
二叉搜索树
刚才说的都是节点没有数值的,而二叉搜索树就跟数值相关的。记住三点就是:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树
平衡二叉搜索树
平衡二叉搜索树又被称之为AVL树。其定义如下:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。就是其是为了搜索的简便性,避免某个极端的情况所有节点只有左子树或者右子树,会给搜索带来复杂。
二叉树的存储方式
链式存储
其实为了简便性,我们一般使用二叉树时都是使用链表进行存储的,即链式存储。与链表的区别就是其有两个指针域,一个指向左子树,一个指向右子树。同时有个数据域表示具体的值。其形式如下:
数组存储
当然我们也是可以使用数组进行存储的,即顺序存储。如何存储呢?就是当其父节点为i时,其左孩子为2i,其右节点为2i+1,如果没有左节点右节点怎么办,其空着就行了代表没有左孩子或者右孩子。其存储方式会比较浪费内存的,所有我们很少使用顺序存储。
二叉树的遍历方式
二叉树的遍历方式总的来说就是只有两种,其细分有前中后序遍历以及层次遍历。
- 深度优先遍历
- 前序遍历(递归法,迭代法)
- 中序遍历(递归法,迭代法)
- 后序遍历(递归法,迭代法)
- 广度优先遍历
- 层次遍历(迭代法)
前中后序到底什么意思呢?其实就是根节点的位置。比如说前序遍历,就是中左右,先根节点在左节点右节点。中序遍历就是,先左节点再根节点右节点。后序遍历就是先左右节点最后根节点。
二叉树的定义(代码)
class TreeNode:
def __init__(self, val, left = None, right = None):
self.val = val
self.left = left
self.right = right
算法基础系列
一文了解什么是数组及其经典考察题目
走进链表及其经典考察题目
还不知道什么是哈希表,看这篇文章就够了
字符串匹配究极大招【KMP】:带你一步步从原理到构建
【栈与队列】:基础实战篇-优快云博客
【双指针法】:这么常用的你怎么能不知道-优快云博客