[Tree Breadth First Search] N叉树的层序遍历

leetcode 429,N-ary Tree Level Order Traversal,难度medium;

0. 题干

给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3叉树 :

[Tree Breadth First Search] N叉树的层序遍历_第1张图片

返回其层序遍历:
[
[1],
[3,2,4],
[5,6]
]

说明:
树的深度不会超过 1000。
树的节点总数不会超过 5000。

1. 代码

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    vector<vector<int>> result;
    vector<vector<int>> levelOrder(Node* root) {
        if (!root) {
            return result;
        }
        result.emplace_back(vector<int>{root->val});
//c++11新加入了emplace_back():
//如果要将一个临时变量push到容器的末尾,
//push_back()需要先构造临时对象,再将这个对象拷贝到容器的末尾,
//而emplace_back()则直接在容器的末尾构造对象,这样就省去了拷贝的过程。
        queue<Node*> que;
        que.push(root);
        
        while (que.size()) {
            int queSize = que.size();
            vector<int> level;
            for (int i = 0; i < queSize; ++i) {
                Node* tmp=que.front();
                que.pop();

                for (auto x : tmp->children) {
                    level.emplace_back(x->val);
                    que.push(x);
                }
            }
			
            if (level.size() != 0) {
                result.emplace_back(level);
            }
        }
        return result;
    }
};

2. 详叙代码流程

/**

for (auto x : tmp->children) {
level.emplace_back(x->val);
que.push(x);
}

这个是处理N叉树的核心代码

创建二维数组 result;
root不为NULL,继续运行代码;
把存储了结点1的val值的一维数组地址放到result数组里面; *此时第一层层序遍历完成
以下面这个N叉树为例子;以下直接把二叉树的值视为结点名;

创建队列que,把结点1放入队列里面;
que.size()为1,创建数组level;
queSize为1,进入for循环,tmp存储结点1地址;
pop掉结点1,依次把结点3、结点2、结点4的值存到新创建的level数组里面;
依次把结点3、结点2、结点4存到队列里面;

此时level.size()为3,把存储了结点3、2、4的值的一维数组地址存到result数组里面; *此时第二层层序遍历完成

此时que.size()为3,queSize为3,
新创建一维数组level,tmp存储结点3的地址,把结点3,pop掉;
把结点3的两个孩子,结点5和结点6的val值依次存到level新创建的level数组里面,并把结点5和结点6存到队列里面。

继续for (int i = 0; i < queSize; ++i) {
循环,tmp存储结点2地址,pop掉结点2 ,结点2没有孩子,就不管内部for循环,继续for循环,
tmp存储结点4的地址,pop掉结点4,结点2没有孩子,就不管内部for循环.

此时level.size()为3,把存储了结点5、6的值的一维数组地址,存到result数组里面; *此时第三层层序遍历完成

que.size()值为2,queSize值为2;
新创建一维数组level,
tmp存储结点5地址,pop掉结点5,结点5没有孩子,不管for (auto x : tmp->children) {循环,
tmp存储结点6地址,pop掉结点6,结点6没有孩子,不管for (auto x : tmp->children) {循环,

此时level.size()为0,que.size()为0;
代码结束,返回result。

你可能感兴趣的:(C++刷算法)