1. 题目信息
题号.题目名称:314. 二叉树的垂直遍历
2. 题目叙述
给你一个二叉树的根结点,返回其结点按垂直方向(从上到下,逐列)遍历的结果。
如果两个结点在同一行和列,那么顺序则为从左到右。
示例 1:
3
/ \
9 20
/ \
15 7
输入:root = [3,9,20,null,null,15,7]
输出:[[9],[3,15],[20],[7]]
3. 模式识别
这是一道二叉树的遍历问题,需要按照垂直方向对二叉树节点进行遍历。可以使用广度优先搜索(BFS)结合哈希表来解决,因为 BFS 可以保证节点按从上到下的顺序访问,哈希表可以方便地记录每一列的节点信息。
4. 考点分析
- 二叉树的遍历,特别是广度优先搜索(BFS)的应用。
- 数据结构的使用,如队列用于 BFS,哈希表用于记录列信息。
- 对节点位置的计算和处理,如何确定节点所在的列。
5. 所有解法
- 广度优先搜索(BFS)+ 哈希表:使用 BFS 遍历二叉树,同时为每个节点记录其所在的列,使用哈希表存储每一列的节点信息。
- 深度优先搜索(DFS)+ 排序:使用 DFS 遍历二叉树,记录每个节点的行、列信息,最后根据列、行、节点值的顺序进行排序。
6. 最优解法(BFS + 哈希表)的 C 语言代码
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 定义队列节点结构,用于 BFS
typedef struct {
struct TreeNode *node; // 二叉树节点
int col; // 节点所在的列
} QueueNode;
// 定义队列结构
typedef struct {
QueueNode *data; // 队列数据
int front; // 队头指针
int rear; // 队尾指针
int capacity; // 队列容量
} Queue;
// 初始化队列
Queue* initQueue(int capacity) {
Queue *q = (Queue*)malloc(sizeof(Queue));
q->data = (QueueNode*)malloc(capacity * sizeof(QueueNode));
q->front = q->rear = 0;
q->capacity = capacity;
return q;
}
// 判断队列是否为空
int isEmpty(Queue *q) {
return q->front == q->rear;
}
// 入队操作
void enqueue(Queue *q, struct TreeNode *node, int col) {
QueueNod