314. 二叉树的垂直遍历

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请向我看齐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值