这些主要罗列二叉树的一些面试题
二叉树的遍历
前序遍历顺序为根左右,下面直接给出二叉树前序遍历的递归实现:
中序遍历的顺序为左根右,下面直接给出二叉树中序遍历的递归实现:
后序遍历的顺序为左右根,下面直接给出二叉树后序遍历的递归实现:
二叉树的深度优先遍历使用栈来实现,其整个遍历过程如下:
- 首先将节点A压入栈中,stack(A)
- 将A节点弹出,将A的子节点C,B压入栈中,stack(B,C)
- 将B节点弹出,同时将B的子节点E,D压入栈中,stack(D,E,C)
- 将节点D弹出,没有子节点压入,此时E在堆的顶部,stack(E,C)
- 将E节点弹出,将E的子节点I压入,stack(I,C)
-
......依次往下
二叉树的广度优先遍历使用队列来实现,整个遍历过程如下:
- 首先将A节点插入到队列中,queue(A)
- 将A节点弹出,同时将A的子节点B,C插入到队列中,queue(B,C)
- 将B节点弹出,同时将B的子节点D,E插入队列中,queue(C,D,E)
- 将C节点弹出,同时将C的子节点F,G,H插入队列中,此时D在队列首,H在队列尾部,queue(D,E,F,G,H)
- 将D节点弹出,D没有子节点,此时E在队列首,H在队列尾部,queue(E,F,G,H)
-
......依次往下
几种二叉树的异同
- 二叉搜索树:二叉树中,每个节点都不比它左子树的任意元素小,不比它右子树的任意元素大(B树是一种二叉搜索树)
- 完全二叉树:除最后一层外,每一层上的节点数都达到最大值,在最后一层上只缺少右边的若干节点
- 满二叉树:除最后一层外,每一层上的所有节点都有两个子节点;满二叉树是一种特殊的完全二叉树(每一层上的节点数都达到最大值)
- 平衡二叉树:是二叉搜索树的一种进化体,又叫AVL树。它的左右子树的高度差不能超过1,如果插入或删除一个节点使得高度只差大于1,就要进行节点之间的旋转,是二叉树重新维持在一种平衡的状态;这种方案很好的避免二叉树退化成链表的问题,把插入,查找,删除的时间复杂度都维持在O(logn)
- 红黑树:1. 每个节点都是红色的或是黑色的;2. 根节点为黑色;3. 叶子节点为黑色;4. 如果一个节点是红色的那么它的两个儿子节点为黑色;5. 对于每个节点,从该节点到其叶子节点构成的所有路径上黑色节点个数相同
关于红黑树可以参考这篇文章:彻底搞懂红黑树