持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
树结构是数据结构中常见的基础结构之一,在算法题中也经常能看到它的身影。
二叉树结合了数组、链表的优点:查找数据的速度和数组一样快、插入和删除数据的速度和链表一样快
二叉树
二叉树是一种特殊的树结构,在二叉树中子节点个数不超过两个,并且有左右顺序之分
根据结构的不同,又可以分为:
- 满二叉树:
- 特点:只有度为0的结点和度为2的结点
- 完全二叉树:
- 特点:
- 完全二叉树是由满二叉树引出的,叶子节点只能出现在最下层和次下层,并且最下层的结点都集中在最左边的若干位置
- 堆是一棵完全二叉树
- 除此之外还有:平衡二叉树、二叉搜索树、红黑树
存储方式
二叉树的存储方式有数组(顺序存储)和链表(链式存储)。在前面的文章 算法之链表的含义 中国有提及到链表和数组的异同
一般情况会使用链式结构来存储二叉树,它的形式也更易于理解,下图是一个节点的结构:
共有三个域:
- 数据域 data
- 左指针域 left
- 右指针域 right
如果是数组存储形式,下标为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)
}
遍历
比如经典的深度优先遍历、广度优先遍历
- 深度优先遍历又包含前序遍历、中序遍历、后序遍历(一般使用链表来实现)
- 广度优先遍历为层次遍历(一般使用队列来实现)