代笔-二叉树-基础

99 阅读2分钟

种类

满二叉树

  • 一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上

  • 深度为k,有2^k-1个节点的二叉树

image.png

完全二叉树

  • 除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置

  • 最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点

image.png

二叉搜索树

  • 二叉搜索树是一个有序(有数值)树

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值

  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  • 它的左、右子树也分别为二叉排序树

image.png

平衡二叉搜索树

  • AVL(Adelson-Velsky and Landis)

  • 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树

  • 最后一棵不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1

  • C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树

    • map、set的增删操作时间时间复杂度是logn

    • unordered_map、unordered_set底层实现是哈希表

二叉树的存储方式

  • 链式存储:指针

    • 通过指针把分布在各个地址的节点串联一起

image.png

  • 顺序存储:数组

    • 在内存是连续分布的

    • 如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2

image.png

二叉树的遍历方式

  • 深度优先遍历(先往深走,遇到叶子节点再往回走)

    • 前序遍历(递归法,迭代法)

      • 中左右
    • 中序遍历(递归法,迭代法)

      • 左中右
    • 后序遍历(递归法,迭代法)

      • 左右中
    • 前中后,指的是中间节点的遍历顺序

    • 栈其实就是递归的一种实现结构

  • 广度优先遍历(一层一层的去遍历)

    • 层次遍历(迭代法)

    • 用队列来实现

二叉树的定义

function TreeNode(val, left, right) {
    this.val = (val===undefined ? 0 : val)
    this.left = (left===undefined ? null : left)
    this.right = (right===undefined ? null : right)
}
class TreeNode {
    public val: number;
    public left: TreeNode | null;
    public right: TreeNode | null;
    constructor(val?: number, left?: TreeNode, right?: TreeNode) {
        this.val = val === undefined ? 0 : val;
        this.left = left === undefined ? null : left;
        this.right = right === undefined ? null : right;
    }
}

代码随想录 (programmercarl.com)