用框架解决树的层序遍历

411 阅读2分钟

有树如下:

层序遍历

层序遍历就是从左到右一层一层的去遍历二叉树,所以得到的结果是[[1],[2,3],[4,5,6,7]];

队列先进先出的特点很适合用来进行树的层序遍历。

思路

  1. 将根节点入队。
  2. 循环判断队列是否为空。如果非空,依次取出当前队列中的所有结点,并将顺序记录。(即某一层的所有结点)
  3. 在取出某一结点的过程中,要同时判断该结点的左右子树是否非空。如果非空,要将该节点左右子树入队。
  4. 重复2,3

框架

leetcode 102为例

102题

框架C++实现如下:

class Solution {
private:
    vector<vector<int> > result;    //存放结果
    queue<TreeNode*> que;   //利用队列模拟
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root != NULL)    //   1.根节点入队
            que.push(root);
        //  2.判断队列是否为空,不为空依次取出当前队列内的所有结点
        while(!que.empty())
        {
            int size = que.size();
            vector<int> res_;   //存储每一层的节点
            //本循环一定要使用固定的size,因为que.size()的大小会随着节点的弹出不断变化
            for(int i = 0;i < size; i++)
            {
                TreeNode* node = que.front();
                res_.push_back(node->val);
                que.pop();              
                //  3.弹出结点的同时判断左右子树是否非空,非空将其入队
                if(node->left)
                    que.push(node->left);
                if(node->right)
                    que.push(node->right);
            }
            result.push_back(res_);
        }
        return result;
    }
};

用框架能解决的leetcode题目

  • 102.二叉树的层序遍历

  • 104.N叉树的最大深度

  • 107.二叉树的层次遍历II

  • 199.二叉树的右视图

  • 637.二叉树的层平均值

  • 429.N叉树的层序遍历

  • 515.在每个树行中找最大值

  • 116.填充每个节点的下一个右侧节点指针

  • 117.填充每个节点的下一个右侧节点指针II

    我要打十个