1. 前言
说到二叉树, 不得不提到的就是递归, 很多同学搞不清递归怎么就进去了, 啥时候又出来, 可能还出不来了, 就形成了无限递归, 本系列帕鲁就会着重讲一下如何写递归, 不过在此之前, 还是先来看一下二叉树的基本概念
2. 二叉树种类
满二叉树
顾名思义, 所有节点都是满的, 若树的深度为n, 则有 个节点
完全二叉树
除了最后一层, 其余层都是满的
最后一层节点不一定满, 但从左到右节点一定是连续的
这是 完全二叉树
这是 完全二叉树
这不是 完全二叉树
二叉搜索树
左孩子的值都小于根节点
右孩子的值都大于根节点
子树也符合上述要求, 对节点布局没有要求, 只要求顺序
时间复杂度为 O(logn)
平衡二叉搜索树
左子树和右子树的高度差绝对值不大于1
这是 平衡二叉搜索树
这不是 平衡二叉搜索树, 左子树高度=3, 右子树高度=1
3. 存储方式
线性存储 与 链式存储
线性存储
以数组的形式保存二叉树 结果为: 某个节点的左孩子是2n+1 某个节点的右孩子是2n+2
举例:
节点 20 (下标为2)的左孩子为 2 * 2 + 1 = 5 下标 = 5 的值为2
节点 20 (下标为2)的右孩子为 2 * 2 + 2 = 6 下标 = 6 的值为8
链式存储
以指针的形式保存二叉树
一个节点会存储三个信息, 值, 左指针, 右指针
左指针指向左子树, 右指针指向右子树
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
4. 遍历方式
总的来说, 分为两大类: 深度遍历和广度遍历
深度遍历又分为三小类: 前序遍历 、 中序遍历、 后续遍历
广度遍历: 层次遍历