## 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. 



