Binary Tree Level Order Traversal I II(102、107)

二叉树层次遍历
本文介绍了二叉树的层次遍历算法,包括从上到下和从下到上的两种遍历方式,并提供了详细的实现代码。同时,文章还探讨了如何通过递归的方式进行层次遍历。

Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).

For example:
Given binary tree {3,9,20,#,#,15,7},

 3
/ \
9  20
   / \
  15  7

return its level order traversal as:

 [
  [3],
  [9,20],
  [15,7]
 ]

思路

层次遍历+简单动归
关键是需要记录当前层有多少个结点。所以需要两个计数器 curcount当前结点数、nextcount下一层结点数。
在遍历当前层的同时统计一下层的结点数。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vvi;
        if(root==NULL) return vvi;
        queue<TreeNode*> que;
        TreeNode* p=root;
        que.push(p);
        int curcount=1;//当前层结点数
        int nextcount=0;//下一层结点数
        vector<int> vi;
        while(!que.empty()){
            p=que.front();
            que.pop();
            vi.push_back(p->val);
            --curcount;
            if(p->left){
                ++nextcount;
                que.push(p->left);
            }
            if(p->right){
                ++nextcount;
                que.push(p->right);
            }
            if(curcount==0){//当前层最后一个结点,下次循环进入下一层
                vvi.push_back(vi);
                vi.clear();
                curcount=nextcount;
                nextcount=0;
            } 
        }
        return vvi;
    }
};

Binary Tree Level Order Traversal II

Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).

For example:
Given binary tree {3,9,20,#,#,15,7},

 3
/ \
9  20
   / \
  15  7

return its level order traversal as:

 [
  [15,7]
  [9,20],
  [3],
 ]

与上题没有本质区别,只是把输出结果的顺序逆转一下就可以了。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        if(root==NULL) return vector<vector<int>>();
        vector<vector<int>> vvi;
        queue<TreeNode*> que;
        TreeNode* p = root;
        que.push(p);
        int curcount = 1;
        int nextcount = 0;
        vector<int> vi;
        while (!que.empty()){
            p = que.front();
            que.pop();
            vi.push_back(p->val);
            --curcount;
            if (p->left){
                ++nextcount;
                que.push(p->left);
            }
            if (p->right){
                ++nextcount;
                que.push(p->right);
            }
            if (curcount == 0){
                vvi.push_back(vi);
                vi.clear();
                curcount = nextcount;
                nextcount = 0;
            }
        }
        reverse(vvi.begin(),vvi.end());//逆序
        return vvi; 
    }
};

递归层次遍历

参考于http://www.cnblogs.com/ganganloveu/p/3843470.html
一直以为先、中、后序遍历可以使用递归(栈)。层次遍历使用队列。原来层次遍历也是可是使用递归的,长见识了~~~~

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution
{
public:
    vector<vector<int> > result;
    void levelTra(TreeNode *root, int level){
        if(root == NULL)
            return;
        if(level == result.size()){
            vector<int> v;
            result.push_back(v);
        }
        result[level].push_back(root->val);
        levelTra(root->left, level+1);
        levelTra(root->right, level+1);
    }

    vector<vector<int> > levelOrderBottom(TreeNode *root){
        levelTra(root, 0);
        return result;// I答案
        return vector<vector<int> >(result.rbegin(), result.rend());// II答案
    }
};
<think>好的,我需要帮助用户找到关于使用C++实现逐层遍历二叉树的算法。首先,我得回忆一下二叉树遍历的基本知识。层序遍历,也就是广度优先搜索(BFS),通常使用队列来实现。用户可能希望得到一个具体的代码示例,以及相关的解释。 接下来,我应该参考用户提供的引用内容,看看是否有相关信息。引用[5]提到了层序遍历的算法,使用逐层打印的方法,但那是C语言的伪代码。用户需要的是C++实现,所以可能需要调整数据结构,比如使用队列来存储节点,而不是递归的方式。然后,我需要确保代码符合C++的语法规范。例如,使用std::queue来处理节点,以及正确的指针操作。同时,要构建一个二叉树结构,可能需要定义节点类,包含数据、左孩子和右孩子指针。 另外,用户可能希望了解算法的步骤和复杂度。层序遍历的时间复杂度是O(n),空间复杂度也是O(n),因为最坏情况下队列需要存储所有节点。这部分需要解释清楚,以帮助用户理解性能。 可能还需要注意边界条件,比如空树的处理。在代码示例中,如果根节点为空,直接返回,避免运行时错误。最后,根据用户的要求,生成相关问题。相关问题应该围绕层序遍历的应用、优化方法、其他遍历方式比较,以及更复杂的变体如锯齿形遍历。这些问题可以帮助用户进一步学习和应用相关知识。 总结步骤:1.解释层序遍历的概念;2.提供C++代码示例,包括二叉树节点定义和遍历函数;3.分析时间和空间复杂度;4.给出相关应用场景;5.生成相关问题。</think>### C++实现二叉树的层序遍历算法 层序遍历Level-order traversal)是一种广度优先搜索(BFS)算法,其核心思想是逐层访问二叉树的节点。以下是具体实现步骤及代码示例: --- #### 1. **二叉树节点定义** 首先需定义二叉树的节点结构: ```cpp struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; ``` --- #### 2. **层序遍历算法实现** 使用队列辅助逐层访问节点: ```cpp #include <queue> #include <vector> std::vector<std::vector<int>> levelOrder(TreeNode* root) { std::vector<std::vector<int>> result; if (!root) return result; std::queue<TreeNode*> q; q.push(root); while (!q.empty()) { int level_size = q.size(); std::vector<int> current_level; for (int i = 0; i < level_size; ++i) { TreeNode* node = q.front(); q.pop(); current_level.push_back(node->val); if (node->left) q.push(node->left); if (node->right) q.push(node->right); } result.push_back(current_level); } return result; } ``` --- #### 3. **算法解析** - **时间复杂度**:$O(n)$,每个节点被访问一次。 - **空间复杂度**:$O(n)$,队列在最坏情况下存储所有叶子节点(如满二叉树最后一层有$n/2$个节点)。 - **队列的作用**:按先进先出(FIFO)原则记录当前层的节点,并依次处理其子节点[^5]。 --- #### 4. **应用场景** - **二叉树的序列化与反序列化**:层序遍历可保留树的结构信息。 - **寻找二叉树的最大宽度**:通过记录每层节点数量实现。 - **判断完全二叉树**:若层序遍历中出现空节点后仍有非空节点,则不是完全二叉树。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值