剑指offer Leetcode 32-I 二叉树的层序遍历
发布日期:2021-05-06 23:39:38 浏览次数:19 分类:精选文章

本文共 2784 字,大约阅读时间需要 9 分钟。

层序遍历

单层向量实现

思路

层序遍历是一种常见的树遍历方式,通常用于前序、后序或层序访问树节点。以下是实现层序遍历的单层向量方法。

解法

该方法通过队列来控制节点的访问顺序。具体步骤如下:

  • 初始化队列:将根节点加入队列。
  • 遍历队列:在每一轮循环中,获取当前队列的大小(即当前层的节点数)。
  • 处理当前层节点:从队列中取出所有当前层的节点,记录其值,并将其左、右子节点加入队列。
  • 收集结果:将当前层的节点值存储在结果向量中。
  • 代码示例

    #include 
    #include
    using namespace std;vector
    levelOrder(TreeNode* root) { if (root == nullptr) return {}; vector
    res; queue(TreeNode*> my_queue; my_queue.push(root); while (!my_queue.empty()) { int size = my_queue.size(); vector
    tmp; while (size--) { TreeNode* cur = my_queue.front(); my_queue.pop(); tmp.push_back(cur->val); if (cur->left) my_queue.push(cur->left); if (cur->right) my_queue.push(cur->right); } res.push_back(vector
    (tmp.rbegin(), tmp.rend())); } return res;}

    双层向量实现

    思路

    该方法与单层向量实现类似,但每次遍历时将当前层的节点值倒序存储到结果向量中。

    解法

  • 初始化队列:将根节点加入队列。
  • 遍历队列:在每一轮循环中,获取当前队列的大小。
  • 处理当前层节点:从队列中取出所有当前层的节点,记录其值,并将其左、右子节点加入队列。
  • 倒序存储结果:将当前层的节点值倒序存储到结果向量中。
  • 代码示例

    #include 
    #include
    using namespace std;vector
    > levelOrder(TreeNode* root) { if (root == nullptr) return {}; vector
    > res; queue
    my_queue; my_queue.push(root); bool reverse = false; while (!my_queue.empty()) { int size = my_queue.size(); vector
    tmp; while (size--) { TreeNode* cur = my_queue.front(); my_queue.pop(); tmp.push_back(cur->val); if (cur->left) my_queue.push(cur->left); if (cur->right) my_queue.push(cur->right); } if (reverse) { res.push_back(vector
    (tmp.rbegin(), tmp.rend())); } else { res.push_back(tmp); } reverse = !reverse; } return res;}

    之字型双层向量实现

    思路

    该方法通过在层序遍历中每层交替倒序和正序存储节点值,形成之字型的结果。

    解法

  • 初始化队列:将根节点加入队列。
  • 遍历队列:在每一轮循环中,获取当前队列的大小。
  • 处理当前层节点:从队列中取出所有当前层的节点,记录其值,并将其左、右子节点加入队列。
  • 交替倒序存储结果:根据循环次数决定当前层是否倒序存储节点值。
  • 代码示例

    #include 
    #include
    using namespace std;vector
    > levelOrder(TreeNode* root) { if (root == nullptr) return {}; vector
    > res; queue
    my_queue; my_queue.push(root); bool reverse = false; while (!my_queue.empty()) { int size = my_queue.size(); vector
    tmp; while (size--) { TreeNode* cur = my_queue.front(); my_queue.pop(); tmp.push_back(cur->val); if (cur->left) my_queue.push(cur->left); if (cur->right) my_queue.push(cur->right); } if (reverse) { res.push_back(vector
    (tmp.rbegin(), tmp.rend())); } else { res.push_back(tmp); } reverse = !reverse; } return res;}

    这些方法通过队列和向量巧妙地控制了树节点的遍历顺序,实现了层序遍历的不同风格。

    上一篇:Neo4j OGM的配置问题
    下一篇:Neo4j本地访问问题

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月09日 23时54分25秒