帕先生之二叉树概念篇

51 阅读2分钟

1. 前言

说到二叉树, 不得不提到的就是递归, 很多同学搞不清递归怎么就进去了, 啥时候又出来, 可能还出不来了, 就形成了无限递归, 本系列帕鲁就会着重讲一下如何写递归, 不过在此之前, 还是先来看一下二叉树的基本概念

2. 二叉树种类

满二叉树

顾名思义, 所有节点都是满的, 若树的深度为n, 则有 2n12^n -1 个节点

binarytree.png

完全二叉树

除了最后一层, 其余层都是满的

最后一层节点不一定满, 但从左到右节点一定是连续的

完全二叉树

binarytree.png

完全二叉树

binarytree.png

不是 完全二叉树

binarytree.png

二叉搜索树

左孩子的值都小于根节点

右孩子的值都大于根节点

子树也符合上述要求, 对节点布局没有要求, 只要求顺序

时间复杂度为 O(logn)

binarytree.png

平衡二叉搜索树

左子树和右子树的高度差绝对值不大于1

平衡二叉搜索树 binarytree.png

不是 平衡二叉搜索树, 左子树高度=3, 右子树高度=1

binarytree.png

3. 存储方式

线性存储链式存储

线性存储

image.png

以数组的形式保存二叉树 结果为: [10,5,20,4,6,2,8][10, 5, 20, 4, 6, 2, 8] 某个节点的左孩子是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. 遍历方式

总的来说, 分为两大类: 深度遍历广度遍历

深度遍历又分为三小类: 前序遍历中序遍历后续遍历

广度遍历: 层次遍历