leetcode——第589题——N叉树的前序遍历(注意st.pop() )三次错了!~

题目:
给定一个 N 叉树,返回其节点值的 前序遍历 。
N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

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

/*
// 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:
/*********************法一::递归法******************/
// // 递归函数传引用!!!!!!
//     void preTravel(Node* root,vector<int>& result)
//     {
//         if(root == nullptr)
//         {
//             return;
//         }
//         result.push_back(root->val);
//         for(int i=0; i<root->children.size(); i++)
//         {
//             preTravel(root->children[i],result);
//         }
//     }

//     vector<int> preorder(Node* root) {
//         vector<int> result;
//         preTravel(root,result);
//         return result;
//     }


/**********************法二:迭代法*********************/
// 统一的迭代法,又称为标记法,精髓就是在 根结点的后面加了一个空节点作为标记
    vector<int> preorder(Node* root)
    {
        stack<Node*> st;
        vector<int> result;
        if(root !=nullptr)  st.push(root);
        while(!st.empty())
        {
            Node* node = st.top();
            // st.pop();  这句话是放在if为真才执行的!!又错了!!!!
            // 也就是需要有元素压栈的话,就需要先把栈顶弹出,在进行压栈操作啦~
            if(node != nullptr)
            {
                st.pop();
                for(int i=(node->children.size())-1; i>=0; i--)
                {
                    // 这里忘记加判断条件了
                    if(node->children[i] != nullptr) st.push(node->children[i]);
                }
                st.push(node);
                st.push(nullptr);
            }
            else
            {
                st.pop();
                node=st.top();
                st.pop();
                result.push_back(node->val);
            }

        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值