题干:N叉树的前序遍历、后序遍历、层序遍历。
代码:
class Node{//前序遍历N叉树(递归实现)
public:int val;vector<Node*>children;Node(int _val, vector<Node*>_children): val(_val), children(_children){}
};class solution{
public:void traversal(Node* node, vector<int> &a){if(node == NULL) return;a.push_back(node -> val);//前序遍历中心思想:先访问当前节点再访问子节点for(int i = 0; i < node -> children.size(); i++){traversal(node -> children[i], a);}}void preorder(Node* root){vector<int>res;traversal(root,res);return res;}
}
class Node{//后序遍历N叉树(递归实现)
public:int val;vector<Node*>children;Node(int _val, vector<Node*>_children): val(_val), children(_children){}
};class solution{
public:void traversal(Node* node, vector<int> &a){if(node == NULL) return;//a.push_back(node -> val);for(int i = 0; i < node -> children.size(); i++){traversal(node -> children[i], a);}a.push_back(node -> val);//后序遍历中心思想:先访问子节点再访问当前节点}void postorder(Node* root){vector<int>res;traversal(root,res);return res;}
}
class Node{//层序遍历N叉树(迭代实现)
public:int val;vector<Node*>children;Node(int _val, vector<Node*>_children): val(_val), children(_children){}
};class Solution {
public:vector<vector<int>> levelOrder(Node* root) {queue<Node*>que;vector<vector<int>>res;if(root != NULL)que.push(root);while(!que.empty()){int size = que.size();vector<int>tmp;while(size--){//for(int i = 0; i < size; i++)也行Node* node = que.front();que.pop();tmp.push_back(node -> val);for(int i = 0; i < node -> children.size(); i++){if(node -> children[i]) que.push(node -> children[i]);}}res.push_back(tmp);}return res;}
};
不难观察到,相较于二叉树,N叉树代码改动的地方只有将if(node-> left(right))que.push(node->left(right))改成了for(int i =0; i < node -> children.size(); i++){if(node->children[i]) que.push(node->children[i])}
补充:
class Solution {//前序遍历的迭代实现
public:vector<int> preorder(Node* root) {stack<Node*>st;vector<int>res;if(root != NULL)st.push(root);while(!st.empty()){Node* node = st.top();st.pop();if(node != NULL){st.push(node);//先搜父节点st.push(NULL);for(int i = 0; i < node -> children.size(); i++){if(node -> children[i]) st.push(node -> children[i]);}//再搜子节点}else{Node* node = st.top();st.pop();res.push_back(node -> val);}}reverse(res.begin(), res.end());//最后需要翻转resreturn res;}
};
class Solution {//后序遍历的迭代实现
public:vector<int> postorder(Node* root) {stack<Node*>st;vector<int>res;if(root != NULL)st.push(root);while(!st.empty()){Node* node = st.top();st.pop();if(node != NULL){for(int i = 0; i < node -> children.size(); i++){if(node -> children[i]) st.push(node -> children[i]);}//先搜子节点st.push(node);//再搜父节点st.push(NULL);}else{Node* node = st.top();st.pop();res.push_back(node -> val);}}reverse(res.begin(), res.end());//也要翻转return res;}
};
对于前后序遍历的迭代实现注意:它们与递归实现思想一致,是“前”就先父后子,是“后”就先子后父。不过迭代要注意最后要反转res。
总之,涉及N叉的(带有children) ,递归实现只需要改if(node->left/right)...位置即可;但是迭代实现需要最后反转一下res。把握住前后就行了。