参考:《漫画算法:小灰的算法之旅》
二叉树是树的一种特殊形式。这种树的每个节点最多有2个孩子节点。二叉树节点的两个孩子节点,一个被称为左孩子(left child),一个被称为右孩子(right child)。这两个孩子节点的顺序是固定的。
二叉树的存储
数据结构分为物理结构和逻辑结构。二叉树属于逻辑结构,它可以通过多种物理结构来表达。
1、链式存储结构
2、数组
链式存储:
链式存储是二叉树最直观的存储方式。
我们知道链表是一对一的存储方式,每个链表节点拥有data变量和一个指向下一个节点的next指针。二叉树复杂一些,一个节点最多可以指向左右两个孩子节点,所以二叉树的每个节点包含3部分。树的每一个节点包括3部分:
存储数据的data变量。
指向左孩子的left指针
指向右孩子的right指针
数组存储:
使用数组存储时,会按照层级顺序把二叉树的节点放到数组中对应的位置上。如果某一个节点的左孩子或者右孩子空缺,则数组的相应位置也空缺出来了。假如一个父节点的下标是parent,那么它的左孩子的节点下标是2*parent+1;右孩子的节点下标是2*parent+2。反过来,假设一个左孩子节点的下标是leftChild,那么它的父节点下标就是(leftChild-1)/2。对于一个稀疏的二叉树来说,用数组表示法是非常浪费空间的。
二叉树的应用
二叉树包含许多特殊的形式,每一种形式都有自己的作用,但是其最主要的应用在于进行查找操作和维持相对顺序这两个方面。
1、查找
二叉树形结构使它很适合扮演索引的角色。比如一种特殊的二叉树:二叉查找树(binary search tree)。
二叉树在二叉树的基础上增加了几个条件:
- 如果左子树不为空,那左子树上所有节点的值均小于根节点的值。
- 如果右子树不为空,那右子树上所有节点的值均大于根节点的值。
- 左、右子树也都是二叉查找树。
比如:
比如查找值为