求二叉树的层序遍历

91 阅读1分钟

描述

给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7},

该二叉树层序遍历的结果是
[
[3],
[9,20],
[15,7]

]

提示:

0 <= 二叉树的结点数 <= 1500

示例1

输入:

{1,2}

返回值:

[[1],[2]]

示例2

输入:

{1,2,3,4,#,#,5}

返回值:

[[1],[2,3],[4,5]

思路分析: 层序遍历,是将一个结点的左右节点,按照一层层的进行遍历,所以我们使用队列,先进先出,从根结点进行push到队列,如果第二层存在,就是队列出来的顺序,第二层每个执行的元素添加到队列当中,所以添加的所有结点在第二层的后面,假设pop遍历第n层的节点,每个节点会push左右两个节点进去。但是队列先进先出。它会放到队尾(下一层)。直到第n层的最后一个pop出来,第n+1层的还在队列中整齐排着,这就达到一个层序的效果。

实例分析: 二叉树{3,9,20,#,#,15,7}

二叉树3
第二层920
第三层157
首先我们创建队列q,将root = 3放进q中,随后对q进行判断,第一层输出[3]
再将第二层放入队列中,pop出队列,返回值[9,20]
同上,最后将第三层[15,7]返回
最终res容器中的值为[[3],[9,20],[15,7]]
	/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */
 
class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @return int整型vector<vector><>>
     */
    vector levelOrder(TreeNode* root) {
        // write code here
        vector res;//存放最终的结果值
        if(root == NULL)
            return res;
        queue<treenode> q;//定义队列
        q.push(root);//将根节点放进去
        while(!q.empty()){
            vector temp;//设立容器
            int n = q.size();//队列中容器的大小
            for(int i = 0; i < n;i++){ TreeNode* node = q.front();//第一个元素 
                q.pop(); 
                temp.push_back(node->val);//将第一层的值存放到容器当中
                if(node->left != NULL)
                    q.push(node->left);//将左子树放进去
                if(node->right != NULL)
                    q.push(node->right);//将右子树放进去
            }
            res.push_back(temp);
        }
        return res;
    }
};</treenode></vector>