【LeetCode-树】n叉树的前序遍历
题目描述
给定一个 N 叉树,返回其节点值的前序遍历。
示例:
例如,给定一个 3叉树 :
返回其前序遍历: [1,3,5,6,2,4]。
题目地址: https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/
思路1
使用类似于二叉树前序遍历的递归方法。代码如下:
/*
// 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;
}
};
*/
class Solution {
public:
vector<int> preorder(Node* root) {
if(root==nullptr) return {};
vector<int> ans;
traverse(root, ans);
return ans;
}
void traverse(Node* root, vector<int>& ans){
if(root==nullptr) return;
ans.push_back(root->val);
for(int i=0; i<root->children.size(); i++){
traverse(root->children[i], ans);
}
}
};
- 时间复杂度:O(n)
n为节点个数。 - 空间复杂度:O(h)
h为树高。
思路2
使用迭代来做,类似于中序遍历的颜色标记法。代码如下:
/*
// 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;
}
};
*/
class Solution {
public:
vector<int> preorder(Node* root) {
if(root==nullptr) return {};
vector<int> ans;
stack<Node*> nodeStack;
stack<int> visit;
nodeStack.push(root); visit.push(0);
while(!nodeStack.empty()){
Node* node = nodeStack.top(); nodeStack.pop();
int hasVisit = visit.top(); visit.pop();
if(hasVisit==0){
for(int i=node->children.size()-1; i>=0; i--){
nodeStack.push(node->children[i]); visit.push(0);
}
nodeStack.push(node); visit.push(1);
}else{
ans.push_back(node->val);
}
}
return ans;
}
};
- 时间复杂度:O(n)
n为节点个数。 - 空间复杂度:O(n)
n为节点个数。