树篇主要总结树的相关概念,没有具体实现分析。二叉搜索树和堆的相关算法都是面试算法题的考核范围内,建议刷刷LeetCode的题。本人面试过的一家大公司甚至会提问红黑树的实现,了解下原理和大概实现也是有备无患。
文章的图片都来自网络,感谢原作者的无私分享,如有侵权请联系本人删除。
1. 二叉树
二叉树是每个结点最多有两个子树的树结构。
2. 满二叉树
如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
3. 完全二叉树
一棵空树,或者是具有下列性质的二叉树:
(1)所有的叶结点都出现在第k层或k-1层(层次最大的两层)
(2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+1。
满二叉树一定是完全二叉树。
4. 堆(Heap)
一棵空树,或者是具有下列性质的二叉树:
(1)任意节点的值总是不大于或不小于其父节点的值;
(2)属于一棵完全二叉树。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
5. 二叉搜索树(Binary Search Tree, BST)
一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉搜索树。
二叉搜索树的中序遍历的结果是升序的。
6. 平衡二叉树(Balanced Binary Tree)
一棵空树,或者是具有下列性质的二叉树:
(1)左右两个子树的高度差的绝对值不超过1;
(2)左、右子树也分别为平衡二叉树。
最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。
平衡二叉树的常用算法有红黑树、AVL、Treap、伸展树、SBT等。
7. 红黑树(R-B Tree)
一棵空树,或者是具有下列性质的二叉搜索树:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。
(4)每个红色结点的两个子结点一定都是黑色。
(5)任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
特点:高度为logN和2logN之间;遍历平均时间复杂度0(N),查找、插入、删除平均时间复杂度O(logN)。
对比AVL树:AVL树是高度平衡的(高度为logN),红黑树是近似平衡的(高度为logN和2logN之间),对于频繁插入/删除的操作红黑树的维护成本低。
8. AVL树
AVL树是一种高度平衡的平衡二叉树,树中的任意节点的左右子树的高度之差不超过1。
9. 树的遍历类型
先序遍历:先访问根节点,再访问左子树,最后访问右子树。
中序遍历:先左子树,再根节点,最后右子树。
后序遍历:先左子树,再右子树,最后根节点。
数据结构相关的链接:
手游开发工程师面试(一) 字典篇(Dictionary
手游开发工程师面试(二) 队列和栈篇(Queue & Stack)
长路漫漫,上下求索