• 算法力扣刷题记录 四十一【N叉树遍历】


    前言

    依然是遍历问题。由二叉树扩展到N叉树遍历。
    记录 四十一【N叉树遍历】


    一、【589. N叉树的前序遍历

    题目

    给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历

    n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

    示例 1:
    在这里插入图片描述

    输入:root = [1,null,3,2,4,null,5,6]
    输出:[1,3,5,6,2,4]
    

    示例 2:
    在这里插入图片描述

    输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
    输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]
    

    提示:

    节点总数在范围 [0, 104]内
    0 <= Node.val <= 10^4
    n 叉树的高度小于或等于 1000
    

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

    思路1

    先用递归法实现。基础肯定是二叉树的前序递归,该如何扩展呢?区别就是child上。

    那么N叉树的child递归使用一个for循环。

    代码实现1【递归法——N叉树前序遍历】

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        vector children;
    
        Node() {}
    
        Node(int _val) {
            val = _val;
        }
    
        Node(int _val, vector _children) {
            val = _val;
            children = _children;
        }
    };
    */
    
    class Solution {
    public:
        void traversal(Node* cur,vector<int>& record){
            if(cur==nullptr){
                return;
            }
            record.push_back(cur->val);
            for(int i = 0;i < cur->children.size();i++){
                traversal(cur->children[i],record);
            }
        }
        vector<int> preorder(Node* root) {
            vector<int> result;
            traversal(root,result);
            return result;
        }
    };
    

    思路2

    使用迭代法:基础:二叉树前序迭代。思想类似。用for循环把所有child放进去。

    代码实现2【迭代法——N叉树前序遍历】

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        vector children;
    
        Node() {}
    
        Node(int _val) {
            val = _val;
        }
    
        Node(int _val, vector _children) {
            val = _val;
            children = _children;
        }
    };
    */
    
    class Solution {
    public:
        vector<int> preorder(Node* root) {
            vector<int> result;
            stack<Node*> st;
            if(root) st.push(root);
            while(!st.empty()){
                Node* cur = st.top();
                st.pop();
                for(int i = cur->children.size()-1;i >= 0 ;i--){	//child从右向左的放进stack
                    if(cur->children[i]) st.push(cur->children[i]);
                }
                result.push_back(cur->val);
            }
            return result;
        }
    };
    

    二、【590. N叉树的后序遍历】

    题目:和一、题目一样,改成后序遍历。

    思路1

    递归法。后序遍历:左右中。先for循环所有child,再push_back。改下位置。

    代码实现1【递归法——N叉树的后序遍历】

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        vector children;
    
        Node() {}
    
        Node(int _val) {
            val = _val;
        }
    
        Node(int _val, vector _children) {
            val = _val;
            children = _children;
        }
    };
    */
    
    class Solution {
    public:
    void traversal(Node* cur,vector<int>& record){
            if(cur==nullptr){
                return;
            }
            
            for(int i = 0;i < cur->children.size();i++){
                traversal(cur->children[i],record);
            }
            record.push_back(cur->val);	//最后返回的时候加入。
        }
        vector<int> postorder(Node* root) {
            vector<int> result;
            traversal(root,result);
            return result;
        }
    };
    

    思路2

    迭代法。二叉树后序遍历迭代由前序遍历迭代法改动2处而来。此处同理。

    代码实现2【迭代法——N叉树的后序遍历】

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        vector children;
    
        Node() {}
    
        Node(int _val) {
            val = _val;
        }
    
        Node(int _val, vector _children) {
            val = _val;
            children = _children;
        }
    };
    */
    
    class Solution {
    public:
        vector<int> postorder(Node* root) {
             vector<int> result;
            stack<Node*> st;
            if(root) st.push(root);
            while(!st.empty()){
                Node* cur = st.top();
                st.pop();
                for(int i = 0;i < cur->children.size();i++){	//child从左向右的放进stack,中右左。
                    if(cur->children[i]) st.push(cur->children[i]);
                }
                result.push_back(cur->val);
            }
            reverse(result.begin(),result.end());	//最后reverse。
            return result;
        }
    };
    

    总结

    N叉树的遍历和二叉树区别在child,用for循环处理所有child,其余同理

    (欢迎指正,转载标明出处)

  • 相关阅读:
    【HDLBits 刷题 9】Circuits(5)Finite State Manchines 1-9
    【算法入门&搜索法】走迷宫|单源最短路径1
    图像直方图的基础知识
    微量元素农业主导-国稻种芯-李喜贵:功能性农业两会档案
    Jenkins发布失败记录
    机器学习实验六:决策树-海洋生物例子
    1688获得店铺详情 API 返回值说明
    CodeTON Round 3 (Div. 1 + Div. 2, Rated, Prizes!) A-D
    嘿,朋友,其实 CSS 动画超简单的 - 时间函数篇(贝塞尔曲线、steps,看完还不懂算我输)
    Airsonic反向代理问题的解决办法
  • 原文地址:https://blog.csdn.net/danaaaa/article/details/140328171