二叉树层序遍历I
创始人
2024-01-25 10:53:06
0

LeetCode二叉树层序遍历I

文章目录

        • LeetCode二叉树层序遍历I
          • 一、递归方法
          • 二、迭代方法

一、递归方法
  1. 首先判断当前root结点是否为空(if(!root)):如果为空,则直接返回(整个递归的出口)
  2. 判断二维数组result的大小与level的大小关系(判定有没有属于自己这一层的网格)
    1. 如果没有,则自己创建一个网格result.push_back(vector());
  3. 将该结点的值放入对应网格的最后,即result[level-1].push_back(p->val);
  4. 在依次递归遍历该结点的左节点和右节点
    1. 左节点:Traversal(root->left, level + 1, result);
    2. 右节点:Traversal(root->right, level + 1, result);

代码如下:

#include
#include
using namespace std;struct TreeNode {TreeNode* left;TreeNode* right;int val;TreeNode(int x) :val(x), left(nullptr), right(nullptr) {};
};class Binary_Tree_Level_Order_Traversal_recursion {vector>LevelOrder(TreeNode* root) {vector> result;Traversal(root, 1, result);return result;}void Traversal(TreeNode* root, int level, vector>& result) {if (!root) return; // 如果root指针为空(0)则返回,函数退出if (level > result.size())result.push_back(vector());result[level - 1].push_back(root->val);Traversal(root->left, level + 1, result);Traversal(root->right, level + 1, result);}
};
二、迭代方法
  1. 利用两个队列的出入队和互换实现层序的遍历
  2. 创建两个队列queue current, next;
  3. 首先将根节点root存入current队列之中
  4. current队列不为空,进入第1个while循环:while (!current.empty())
    1. 创建用于保存该层数据的一维向量vector Level;
    2. 进入第2个循环:while (!current.empty()),循环内操作与前序遍历很类似
      1. 将队首元素出队,即current.pop()
      2. 保存出队元素的值,即level.push_back(p->val);
      3. 分别将左右孩子的指针(如果存在的话)存到next队列中,用来下一次的遍历
        1. 左孩子:if (p->left) next.push(p->left);
        2. 右孩子:if (p->right) next.push(p->right);
    3. level的值存进result
    4. current的内容与next队列互换即可准备下一层的遍历操作

代码如下:

#include
#include
#include
using namespace std;class Binary_Tree_Level_Order_Traversal_iteration {vector> LevelOrder(TreeNode* root) {vector> result;Traversal(root, 1, result);return result;}void Traversal(TreeNode* root, int level, vector>& result) {queue current, next;current.push(root);if (!root) return;while (!current.empty()) {vector Level;while (!current.empty()) {TreeNode* p = current.front();current.pop();Level.push_back(p->val);if (p->left) next.push(p->left);if (p->right) next.push(p->right);}result.push_back(Level);swap(current, next);}}
};

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...