前序遍历的顺序是:根节点 -> 子节点1 -> 子节点2 -> ... -> 子节点N
递归:
cpp
class Solution {
private:
void traverse(Node* cur, vector<int>& res){
if(cur == NULL) return;
res.push_back(cur->val);
for(Node* child: cur->children){
traverse(child,res);
}
}
public:
vector<int> preorder(Node* root) {
vector<int> res;
traverse(root, res);
return res;
}
};
- 队列(Queue) 是 先进先出(FIFO) 的数据结构,适用于 层序遍历(BFS) ,而 前序遍历(DFS) 应该使用 栈(Stack)(后进先出,LIFO)。
cpp
class Solution {
public:
vector<int> preorder(Node* root) {
vector<int> res;
if(root == NULL) return res;
stack<Node*> st;
st.push(root);
while(!st.empty()){
Node* cur = st.top();
res.push_back(cur->val);
st.pop();
int size = (cur->children).size();
// 子节点从右到左入栈,保证左子节点先出栈
for(int i = size-1; i >= 0; i--){
st.push(cur->children[i]);
}
}
return res;
}
};