N叉树的遍历

刷题刷到了就记录,毕竟用的少不熟悉(迭代写法)。

节点定义:

class Node
{
public:
    int val;
    vector<Node *> children;
    Node() {}
    Node(int _val)
    {
        val = _val;
    }
    Node(int _val, vector<Node *> _children)
    {
        val = _val;
        children = _children;
    }
};
View Code

前序遍历:

class Solution
{
public:
    vector<int> preorder(Node *root)
    {
        stack<Node *> q;
        Node *n;
        vector<int> ans;
        q.push(root);
        while (q.size() && q.top() != nullptr)
        {
            n = q.top();
            q.pop();
            ans.emplace_back(n->val);
            for (int i = n->children.size() - 1; i >= 0; --i)
                q.push(n->children[i]);
        }
        return ans;
    }
};
前序迭代

注意一点是,

将栈换成队列,然后子节点逆序遍历放入,就变成了层序遍历(迭代)

后续遍历也是如同二叉树一样借助pre节点处理。

stack<Node *> st;
         Node *n, *pre = nullptr;
         vector<int> ans;
         st.push(root);
         while (st.size() && st.top() != nullptr)
         {
             n = st.top();
             if (n->children.size() ^ 0 && pre != n->children[n->children.size() - 1])
                 for (int i = n->children.size() - 1; i >= 0; i--)
                     st.push(n->children[i]);
             else
                 ans.emplace_back(n->val), pre = st.top(), st.pop();
         }
         return ans;
后续遍历

话说,N叉树遍历应该是没有中序遍历的吧?

【Over】

 

posted @ 2022-03-10 13:15  Renhr  阅读(39)  评论(0)    收藏  举报