• 【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为节点个数。
  • 相关阅读:
    tkinter 改变按钮状态
    python 遗传算法精简版
    极简反传(BP)神经网络
    python 操作注册表
    python 调用 shell 命令方法
    Python标准库:内置函数dict(mapping, **kwarg)
    3.2.2 正則表達式的功能
    NSArray利用Cocoa框架进行汉字排序
    Java多线程具体解释
    android6.0权限管理工具EasyPermissionUtil
  • 原文地址:https://www.cnblogs.com/flix/p/12763553.html
Copyright © 2020-2023  润新知