Files
obsidian_sycn/知识管理/编程经验/LeetCode刷题/二叉树题整理.md
T
2026-07-31 15:28:08 +08:00

78 lines
2.8 KiB
Markdown

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