先了解一下关于树的相关术语:
节点深度:对任意节点x,x节点的深度表示为根节点到x节点的路径长度。所以根节点深度为0,第二层节点深度为1,以此类推
节点高度:对任意节点x,叶子节点到x节点的路径长度就是节点x的高度 树的深度:一棵树中节点的最大深度就是树的深度,也称为高度
父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点 子节点:一个节点含有的子树的根节点称为该节点的子节点
节点的层次:从根节点开始,根节点为第一层,根的子节点为第二层,以此类推 兄弟节点:拥有共同父节点的节点互称为兄弟节点
度:节点的子树数目就是节点的度 叶子节点:度为零的节点就是叶子节点
祖先:对任意节点x,从根节点到节点x的所有节点都是x的祖先(节点x也是自己的祖先)
后代:对任意节点x,从节点x到叶子节点的所有节点都是x的后代(节点x也是自己的后代) 森林:m颗互不相交的树构成的集合就是森林
树的种类
无序树,有序树,二叉树,满二叉树(完美二叉树),完全二叉树,完满二叉树,霍夫曼树(最优二叉树),二叉查找树(二叉搜索树、二叉排序树、BST),平衡二叉查找树(AVL树),红黑树,伸展树,替罪羊树,B树(B-树),B+树,B*树,字典树,线索二叉树
二叉树的遍历方法,动画演示看这里
- 中序遍历:即左-根-右遍历,对于给定的二叉树根,寻找其左子树;对于其左子树的根,再去寻找其左子树;递归遍历,直到寻找最左边的节点i,其必然为叶子节点,然后遍历i的父节点,再遍历i的兄弟节点。随着递归的逐渐出栈,最终完成遍历
- 先序遍历:即根-左-右遍历。从根节点开始,先获取根节点的值,然后获取左子树所有节点的值,最后获取所有右子树所有节点的值,其中对于子树的遍历也是递归按照这个规律。
- 后序遍历:即左-右-根遍历
- 层序遍历:按照树的层次一层一层遍历
有序树
无序树
二叉树
树的任意节点至多包含两棵子树
二叉树遍历:二叉树的遍历是指从二叉树的根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。
二叉树的访问次序可以分为四种:前序遍历 中序遍历 后序遍历 层次遍历
满二叉树(完美二叉树)
①除了叶子节点,每一个节点都有两个子节点
②每一层都填满
完全二叉树
①除了最后一层,其他每一层都被填满
②优先填充左节点
完满二叉树
①除了叶子节点,每一个节点都有两个子节点
二叉查找树:特殊的二叉树
若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值
任意节点的左、右子树也分别为二叉查找树
没有键值相等的节点
平衡二叉查找树:特殊的二叉查找树
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树
红黑树:特殊的平衡二叉查找树,动画演示看这里
- 查找,插入,删除的时间复杂度都是O(logn)
- 节点只能是红色或者黑色
- 根节点和叶节点是黑色的
- 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点–>可以连续两个黑色节点)
- 每个节点的左子树都小于自身,右子树都大于自身
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点
使用场景:红黑树多用于搜索,插入,删除操作多的情况下
红黑树和AVL严格平衡二叉查找树相比:AVL查询时间复杂度<logn,比红黑树效率高,但是AVL为了保持严格的平衡,会在每次插入和删除时进行复杂的调整,相比而言红黑树插入和删除就很方便,所以对于经常插入和删除的场景下使用红黑树更好
B树(B-树):特殊的平衡多叉树
B+树:特殊的平衡多叉树