算法之二叉树基础

34 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

树结构是数据结构中常见的基础结构之一,在算法题中也经常能看到它的身影。

二叉树结合了数组、链表的优点:查找数据的速度和数组一样快、插入和删除数据的速度和链表一样快

二叉树

二叉树是一种特殊的树结构,在二叉树中子节点个数不超过两个,并且有左右顺序之分

根据结构的不同,又可以分为:

  1. 满二叉树:
  • 特点:只有度为0的结点和度为2的结点

image.png

  1. 完全二叉树:
  • 特点:
    • 完全二叉树是由满二叉树引出的,叶子节点只能出现在最下层和次下层,并且最下层的结点都集中在最左边的若干位置
    • 堆是一棵完全二叉树

image.png

  1. 除此之外还有:平衡二叉树、二叉搜索树、红黑树

存储方式

二叉树的存储方式有数组(顺序存储)和链表(链式存储)。在前面的文章 算法之链表的含义 中国有提及到链表和数组的异同

一般情况会使用链式结构来存储二叉树,它的形式也更易于理解,下图是一个节点的结构:

共有三个域:

  • 数据域 data
  • 左指针域 left
  • 右指针域 right

image.png

如果是数组存储形式,下标为i的节点,它的左子节点就是 i * 2 + 1,右子节点就是 i * 2 + 2

定义二叉树:

class Node{
    constructor(data, left, right){
        this.data = data;
        this.left = left;
        this.right = right;
    }
}

或者可以使用函数的形式:

function TreeNode(data, left, right) {
    this.val = (data === undefined ? 0 : data)
    this.left = (data === undefined ? null : left)
    this.right = (data === undefined ? null : right)
}

遍历

比如经典的深度优先遍历、广度优先遍历

  • 深度优先遍历又包含前序遍历、中序遍历、后序遍历(一般使用链表来实现)
  • 广度优先遍历为层次遍历(一般使用队列来实现)