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