LeetCode:589. N叉树的前序遍历

本文介绍N叉树的前序遍历算法,包括递归和迭代两种方法。递归方法通过全局vector容器实现,迭代方法则利用栈进行节点的压入和弹出,详细解析了每种方法的时间和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

589. N叉树的前序遍历

给定一个 N 叉树,返回其节点值的前序遍历。

例如,给定一个 3叉树 :

                  1

               /   |    \

           3      2      4

         /   \

       5      6

返回其前序遍历: [1,3,5,6,2,4]。

 

说明: 递归法很简单,你可以使用迭代法完成此题吗?

链接:https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal

参考:LeetCode题解

方法1 递归:

思路:跟二叉树的前序遍历相似,注意vector容器v要定义为全局v

时间复杂度:O(n) ?

空间复杂度: O(n) ?

// 1. 递归
vector<int> v;                                          // 函数外定义全局vector容器v !!!
vector<int> preorder(Node* root) {
    if (root == NULL)
        return {};
    
    v.push_back(root->val);
    for (int i = 0; i < root->children.size(); i++)     // 将root的子节点从右向左压入栈中
    {
        preorder(root->children[i]);
    }
    
    return v;
}

 

方法2 迭代:

思路:

在将children压入栈中时,要注意顺序,从右往左压入栈中(而递归法会自动从最左边的children开始遍历

另外,while条件是 while(!st.empty()) 栈非空!而不是常规二叉树的 while(root != NULL || !st.empty())

时间复杂度:O(n),其中 n 是 N 叉树中的节点个数。每个节点只会入栈和出栈各一次。

空间复杂度:O(n),在最坏的情况下,这棵 N 叉树只有 2 层,所有第 2 层的节点都是根节点的孩子。将根节点推出栈后,需要将这些节点都放入栈,共有 n-1 个节点,因此栈的大小为 O(n)

// 2. 迭代
vector<int> preorder(Node* root) {
   if (root == NULL) 
        return {};

    vector<int> v;
    stack<Node*> st;
    st.push(root);                                              // 先将根节点值入栈
    while (!st.empty())                                         // 注意条件:栈非空!error: while (root != NULL)
    {
        root = st.top();
        v.push_back(root->val);                                 // root出栈前先将val值存入vector容器中
        st.pop();
        for (int i = root->children.size() - 1; i >= 0; i--)    // 将root的子节点从右向左入栈,最左边后入栈,所以能先出栈获取到
        {
            st.push(root->children[i]);                         // 将root的子节点按顺序分别入栈
        }
    }
    return v;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值