本片内容是根据Adam Drozdek编写的英文版教材《数据结构与算法》整理的,主要是树的底层实现,以及相关的一些内容。后面会再整理一些应用到了树的经典算法题。由于知识点较多,所以分成两篇文章。
1.基本介绍
1.1树的出现
先来看看其他几种数据结构,链表相对数组更灵活,尤其是插入和删除操作,但是链表不能表示封层对象;栈和队列可以反应出分层,当时仅限于一维。所以引入了一种新的数据结构:树,来表示分层的对象。
1.2树的一些定义
Length:从根节点到目的节点的边(两个节点之间为一条边)的数量
Level:length+1
Height:level的最大值
1.3树的类别
二叉树(binary tree):每个节点最多有两个子节点,这两个子节点称为左节点、又节点
完全二叉树(complete binary tree):非终结节点(树的最后一个节点)都有两个子节点,且所有的叶节点(leaves)都在同一层。
二叉搜索树(binary search tree):对于所有的节点,左子节点比父节点的值小,右子结点比父节点的值大,(一个树里没有相同值的节点)
平衡树(balanced tree):对于任何节点的左子树和右子树的高度差小于等于1
二叉树的应用很广泛,尤其是二叉搜索树,所以后面的代码示例大多都是针对二叉搜索树。
2.二叉树的实现
2.1通过数组实现
数组里存放的是对象:
public class ArrayForTreeNode {
int value;
int leftPosition;//表示该节点的左子节点在数组中的位置
int rightPosition;//表示该节点的左子节点在数组中的位置
}
Index |
Value |
leftPosition |
rightPosition |
0 |
13 |
1 |
2 |
1 |
14 |
-1 |
-1 |