二叉树的层序遍历

二叉树的层序遍历就是按照二叉树的深度分层遍历,也就是广度优先遍历(BFS)。层序遍历使用队列,一种先进先出(FIFO)的数据结构。下面简单介绍下二叉树 的层序遍历。

层序遍历从根节点开始,将根节点压入队列中,每次访问一个节点,就将其左右儿子节点压入队列中,直到队列为空,说明遍历结束。代码如下:

class Solution {
public:
    vector<int> levelOrder(TreeNode* root) {
        vector<int> ret;
        if(root==NULL)return ret;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty())
        {
            TreeNode *curr=q.front();
            q.pop();
            ret.push_back(curr->val);
            if(curr->left)q.push(curr->left);
            if(curr->right)q.push(curr->right);
        }
        return ret;
    }
};

例如如下的二叉树,结果如下:

《二叉树的层序遍历》

结果:[1,2,3,4,5,9,4,7,0]

更近一步,如果需要将结果存在一个二维数组里(这里的二维数组长度不一),我们需要将每一层的数据保存起来,我们需要在根节点后压入NULL节点表示一层结束,当以后每访问到NULL节点时,说明当前层已经遍历完毕。代码如下:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        vector<int> level_data;
        if(root==NULL)
            return res;
        queue<TreeNode*> q;
        q.push(root);
        q.push(NULL);
        while(!q.empty())
        {
            TreeNode* temp=q.front();
            q.pop();
            if(temp)
            {
                level_data.push_back(temp->val);
                if(temp->left)
                    q.push(temp->left);
                if(temp->right)
                    q.push(temp->right);
            }
            else
            {
                if(!level_data.empty())
                {
                    q.push(NULL);
                    res.push_back(level_data);
                    level_data.clear();
                }
            }
        }
        return res;
    }
};

对于上面的二叉树,结果如下: [

    [1],

    [2,3],

    [4,5,9],

    [4,7,0]

]

    原文作者:Ezioooooo
    原文地址: https://blog.csdn.net/u012877472/article/details/49451233
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞