429. N叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
返回其层序遍历:
[
[1],
[3,2,4],
[5,6]
]
说明:
- 树的深度不会超过
1000
。 - 树的节点总数不会超过
5000
。
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
//特判
if(root == nullptr) return {};
vector<vector<int>> res;
queue<Node*> qu;
qu.push(root);
while(!qu.empty()){
vector<int> temp;
//每一层的个数
int size = qu.size();
for(int i = 0; i < size; i++){
Node* node = qu.front();
temp.push_back(qu.front()->val);
//遍历队头的孩子节点,如果不为空,加入队列
for (auto node : qu.front()->children) {
if (node){
qu.push(node);
}
}
qu.pop();
}
res.push_back(temp);
}
return res;
}
};
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
589. N叉树的前序遍历
难度简单83
给定一个 N 叉树,返回其节点值的前序遍历。
例如,给定一个 3叉树
:
返回其前序遍历: [1,3,5,6,2,4]
。
1.递归解法
class Solution {
vector<int> res;
public:
vector<int> preorder(Node* root) {
if(!root) return{};
res.push_back(root->val);
for(auto p : root->children){
preorder(p);
}
return res;
}
};
2.迭代解法
class Solution {
public:
vector<int> preorder(Node* root) {
if(!root) return{}; //特判
vector<int> res;
stack<Node*> st;
st.push(root);
Node* p;
while(!st.empty()){
p = st.top();
st.pop();
res.push_back(p->val);
int size = p->children.size();
for(int i = size-1; i>=0; i--){
st.push(p->children[i]);
}
}
return res;
}
};
590. N叉树的后序遍历
给定一个 N 叉树,返回其节点值的后序遍历。
例如,给定一个 3叉树
:
返回其后序遍历: [5,6,3,2,4,1]
.
分析:多叉树的后序遍历,仍然是左->右->根的顺序,只不过这里的左右是从左到右的顺序。N叉树的前序遍历类似, 但子树的入栈顺序为从左到右,最后将数组反转一下
class Solution {
public:
vector<int> postorder(Node* root) {
vector<int> v;
if(!root) return v;
stack<Node*> s;
s.push(root);
while(!s.empty()){
Node* node = s.top();
v.push_back(node->val);
s.pop();
//从左到右入栈
for(int i = 0 ; i < node->children.size(); ++i){
if(node->children.at(i)) //非空结点才入栈
s.push(node->children.at(i));
}
}
//将v反转
reverse(v.begin(), v.end());
return v;
}
};
另外因为多叉树有多个分叉,因此就没有中序遍历的概念了。