代码随想录训练营第二十一天 |589.N叉数的前序遍历 590.N叉树的后序遍历

589.N叉数的前序遍历:

状态:已做出

思路:

N叉树的前序遍历和二叉树很像,我这里使用栈来实现。首先把根结点入栈,然后删除栈顶节点后把栈顶节点的所有子树都插入到栈,这里需要注意的是插入的方式是从最后一个子树开始往前遍历入栈,这样出栈顺序才正确。按照这个出栈根结点,进栈子树节点,就可以实现前序遍历。

代码如下:

cpp 复制代码
/*
// 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) {
        stack<Node*>st;//使用栈来实现前序遍历
        vector<int>result;
        if(!root) return result;
        st.push(root);
        while(!st.empty()) {
            Node* temp=st.top();//取出栈顶元素,这就是前序遍历的根节点处理
            st.pop();
            result.push_back(temp->val);
            //以下循环就是让每个节点的子树全部都依次入栈
            for(int i=temp->children.size()-1;i>=0;--i) {
                st.push(temp->children[i]);
            }
        }
        return result;
    }
};

590.N叉树的后序遍历:

状态:已做出

思路:

和N叉树的前序遍历一样,最后对其进行反转即可。

代码如下:

cpp 复制代码
/*
// 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> postorder(Node* root) {
        stack<Node*>st;
        vector<int>result;
        if(!root) return result;
        st.push(root);
        while(!st.empty()) {
            Node* temp=st.top();
            st.pop();
            result.push_back(temp->val);
            //这里的循环和前序遍历相反,这样才能让最后反转的数组符合后序遍历
            for(int i=0;i<temp->children.size();++i) {
                st.push(temp->children[i]);
            }
        }
        reverse(result.begin(), result.end());//反转数组
        return result;
    }
};

总结:

这两道题目就是二叉树前后序遍历的衍生,和二叉树的前后序遍历一样的操作,主要还是练习前后序操作的思想。

相关推荐
2301_790300961 天前
C++中的命令模式
开发语言·c++·算法
2301_822376941 天前
C++中的解释器模式
开发语言·c++·算法
xhbaitxl1 天前
算法学习day31-贪心算法
学习·算法·贪心算法
爱学习的阿磊1 天前
C++代码冗余消除
开发语言·c++·算法
YuTaoShao1 天前
【LeetCode 每日一题】2976. 转换字符串的最小成本 I
算法·leetcode·职场和发展
皮皮哎哟1 天前
夯实基础:数据结构核心概念与线性表(顺序表&链表)C语言全解析 数据结构篇
c语言·数据结构·顺序表·单向链表·有头链表
蒟蒻的贤1 天前
滑动窗口策略
算法
蜡笔小马1 天前
8.Packing 算法
数据结构·b树
划破黑暗的第一缕曙光1 天前
[数据结构]:4.二叉树_堆
c语言·数据结构·二叉树·
闪电麦坤951 天前
Leecode热题100:矩阵置零(矩阵)
线性代数·算法·矩阵