一、常见的树
首先树是一堆元素的集合,若不为空则至少含有一个根节点以及0或多个子树。
二叉树则是每个结点最多有两个子树的树结构;二叉树(Binary Tree)主要包括:满二叉树、完全二叉树、二叉搜索树、平衡二叉树。
- 满二叉树:除了叶节点外每一个节点都有左右子叶
- 完全二叉树:由满二叉树转化而来,也就是将满二叉树从最后一个节点开始删除,一个一个从后往前删除,剩下的就是完全二叉树。
- 二叉搜索树:又叫二叉查找树,也叫BST(Binary Sort Tree;左结点小于根节点,右结点大于根节点的一种排序树,左、右子树也分别为二叉搜索树
查找、插入、删除的时间复杂度为O(logN)
但最差时候会是 O(n),比如插入的元素是有序的,生成的二叉搜索树就是一个链表,树的一条腿特变长,这种情况下,需要遍历全部元素才行(见图 b
但这在插入有序的元素时不太好控制,无法判断当前的树是否需要调整。
因此就要用到平衡二叉树(AVL )了。
- 平衡二叉树:全称平衡二叉搜索树,也叫AVL树。是一种自平衡的树。AVL树也规定了左结点小于根节点,右结点大于根节点。并且还规定了左子树和右子树的高度差不得超过1;并且子树也必须是一棵平衡二叉树
平衡二叉树的提出就是为了保证树不至于出现二叉查找树的极端一条腿长现象,尽量保证两条腿平衡。查找、插入、删除的时间复杂度都为O(logN),通过旋转保持平衡
红黑树就是一种平衡二叉树
二、树的遍历
这里要区分一下:
如何遍历树(前序、中序、后序、层次)
如何遍历图(深度优先搜索DFS、广度优先搜索BFS)对树来说:
- 深度遍历有前序、中序以及后序三种遍历方法,
- 广度遍历即我们寻常所说的层次遍历(一层一层遍历
前、中、后序遍历:
引申:
根据前序和中序可以构造一颗二叉树,根据中序和后序也可以构建一颗二叉树。
必须要有中序才能构建,因为没有中序,你没办法确定树的形状。
比如先序和后序是不能构建唯一的一颗二叉树的。 例如: 先序为:[1, 2] 后序为:[2, 1],可以构建出两颗树