2.8 KiB
2.8 KiB
1. 基本概念
-
完全二叉树:若二叉树的高度是 h,除第 h 层之外,其他(1~h-1)层的节点数都达到了最大个数,并且第 h 层的节点都连续的集中在最左边。想到点什么没?实际上,完全二叉树和堆联系比较紧密。
-
满二叉树:除最后一层外,每一层上的所有节点都有两个子节点,最后一层都是叶子节点。
-
哈夫曼树:给定 n 个权值作为 n 的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树 (Huffman tree)。
-
二叉排序树:又称二叉查找树(Binary Search Tree),亦称二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
- 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
- 左、右子树也分别为二叉排序树;
- 没有键值相等的节点
- 二分查找的时间复杂度是 O(log(n)),最坏情况下的时间复杂度是 O(n)(相当于顺序查找)
-
平衡二叉树:又称 AVL 树。平衡二叉树是二叉搜索树的进化版,所谓平衡二叉树指的是,左右两个子树的高度差的绝对值不超过 1。
-
红黑树:红黑树是每个节点都带颜色的树,节点颜色或是红色或是黑色,红黑树是一种查找树。红黑树有一个重要的性质,从根节点到叶子节点的最长的路径不多于最短的路径的长度的两倍。对于红黑树,插入,删除,查找的复杂度都是 O(log N)。
2. 面试题总结
- 遍历问题
- 前序遍历
def preOrderTraverse(node):
if not node:
return None
print(node.val)
preOrderTraverse(node.left)
preOrderTraverse(node.right)
2. 中序遍历
def inOrderTraverse(node):
if node is None:
return None
inOrderTraverse(node.left)
print(node.val)
inOrderTraverse(node.right)
3. 后序遍历
def postOrderTraverse(node):
if node is None:
return None
postOrderTraverse(node.left)
postOrderTraverse(node.right)
print(node.val)
4. 层次遍历
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res = []
queue = [root]
while queue:
num = len(queue)
tmp = []
for _ in range(num):
node = queue.pop(0)
tmp.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(tmp)
return res