前言
本文将主要围绕以下问题进行讨论:
二叉树的层序遍历、垂序遍历。
层序遍历的两种方法 【迭代法】【递归法】
垂序遍历的两种方法 【递归排序】【哈希递归】
对于垂序遍历的方法多种多样,大家也可以多多尝试不同的思路。
一、如何理解二叉树的层序遍历?
从根节点开始,首先访问根节点,然后依次访问根节点的每一层的所有节点。从第一层开始,自上而下,从左至右依次访问每一层的节点。
题目链接: [点击跳转] Leetcode 102. 二叉树的层序遍历
二、二叉树层序遍历
1.方法一(迭代法)
进行广度优先搜索,所以选择借助先进先出的队列。
引用辅助队列,首先对传入节点进行判断,若不为空,压入队列中。
这时,进入循环(直至队列为空:所有节点全部遍历完成停止)
在if循环中遍历出同一层的所有节点,再指向两侧子节点。
如下代码可以实现层序遍历,并且已标注好每句的作用:
class Solution {
public:
vector<vector<int>> tre;//用于存储最终的层序遍历结果,其中每个子向量代表一层的节点值。
queue<TreeNode*> que;//用于辅助实现层序遍历,存储待处理的节点。
vector<vector<int>> levelOrder(TreeNode* root) {
if (root == nullptr) {
return tre;
}
que.push(root);//如果根节点不为空,将根节点root放入队列que中
while (!que.empty()) {
//进入循环,只要队列不为空,就一直进行
int size = que.size();//记录当前队列的大小size,这个大小代表了当前层的节点数量
vector<int> level;//创建一个临时向量level,用于存储当前层的节点值
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();//取出队首节点node
que.pop();//并将其从队列中弹出
level.push_back(node