二叉树核心概念与遍历方法
满二叉树
如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。。
完全二叉树
除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。
二叉搜索树(BST)
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树。
平衡二叉搜索树(AVL)
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
map、set、multimap,multiset的底层实现都是平衡二叉搜索树,unordered_map、unordered_set底层实现是哈希表。
二叉树存储与遍历方式
二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。
存储方式
-
链式存储:通过左右指针连接节点
cppstruct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; -
顺序存储:使用数组,适合完全二叉树
深度优先遍历(DFS)
前中后序指的就是中间节点的位置,借助栈使用递归的方式
递归三要素:
- 参数与返回值:通常传入当前节点指针和结果容器
- 终止条件:当前节点为空时返回
- 单层逻辑:按前/中/后序处理节点
前序遍历代码示例:
cpp
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == nullptr) return;
vec.push_back(cur->val); // 中
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
}
广度优先遍历(BFS)
使用队列实现层序遍历:
cpp
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if (root) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> level;
for (int i = 0; i < size; i++) { //que.size是不断变化的
TreeNode* node = que.front();
que.pop();
level.push_back(node->val);
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
result.push_back(level);
}
return result;
}
递归法
遍历根节点(depth=0):result.size()=0 → 新建 vector,result 变为 [[]];
遍历根的左孩子(depth=1):result.size()=1 → 新建 vector,result 变为 [ [], [] ];
遍历根的右孩子(depth=1):result.size()=2 > 1 → 不创建,直接往 result[1] 里加值。
力扣题目解题要点
144.二叉树的前序遍历
102.二叉树的层序遍历
107.二叉树的层次遍历 II
反转
429. N 叉树的层序遍历
TreeNode是「固定 2 个子节点」,Node是「任意 N 个子节点」。
右视图(199题)
层序遍历时记录每层最后一个节点:
cpp
if (i == size - 1) result.push_back(node->val);
层平均值(637题)
统计每层节点值的和再取平均:
cpp
result.push_back(sum / size);
515.在每个树行中找最大值
int maxValue=INT_MIN;
maxValue=node->val>maxValue?node->val:maxValue;
填充右侧指针(116题)
层序遍历时连接同层相邻节点:
cpp
nodePre->next = node; // 前驱节点指向当前
nodePre = node; // 更新前驱
最大深度(104题)
cpp
depth + +
最小深度(111题)
注意只有到达叶子节点时才更新深度:
cpp
if (!node->left && !node->right)
return depth;