【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为节点个数。
posted @ 2020-04-23 21:07  Flix  阅读(216)  评论(0编辑  收藏  举报