cc++ leetcode N叉树的前后遍历

c/c++ leetcode N叉树的前后遍历

前序遍历

题目描述

589. N叉树的前序遍历

难度简单91

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

例如,给定一个 3叉树 :

img

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

解法一: 递归

前序遍历的访问顺序:

根节点 -> 左子树 -> 右子树;

需要注意的是这返回的结果不能局部的变量 ,也不可以是值传递;

class Solution {
public:
    vector<int> preorder2(Node* root) {
        vector<int> temp;
        if (root == NULL) return temp;
        
        return DLR(root,temp);
        
    }
private:
    //DLR - 是前序遍历
    vector<int> DLR(Node* root,vector<int>& temp);
};

vector<int> Solution::DLR(Node* root,vector<int>& temp){
     if(root == NULL) return temp;

     temp.push_back(root -> val);

     int len = root -> children.size();

     for(int i = 0; i<len ; i++){
         DLR(root -> children[i],temp);
     }

     return temp;
}
时空复杂度分析:

时间复杂度:为O(N); N是树的节点个数

空间复杂度: 为 O(N); 开辟的栈空间;

解法二:用stack容器

vector<int> preorder(Node* root) {
        vector<int> ret;
        stack<Node*> S;
        Node* temp = NULL;
        if(root == NULL) return ret;
        S.push(root);
        while(!S.empty()){
            temp = S.top();
            S.pop();
            ret.push_back(temp -> val);
			
            //逆向遍历孩子数组,让最右孩子先进栈 
            for(vector<Node*>::reverse_iterator it =temp -> children.rbegin();
                  it != temp -> children.rend();it++){ 
                S.push(*it);
            }
        }
        return ret;
        
    }

后序遍历

题目描述

590. N叉树的后序遍历

难度简单89收藏分享切换为英文关注反馈

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

例如,给定一个 3叉树 :

img

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

解法一: 递归

前序遍历的访问顺序:

左子树 -> 右子树 -> 根节点;

class Solution {
public:
    vector<int> postorder(Node* root) {
        if (root == NULL) return ans;
        
        for (int i = 0; i < root -> children.size(); ++i){
            postorder(root -> children[i]) ;
        }
        ans.push_back(root -> val);
        
        return ans;
    }
private:
    vector<int> ans;
};
时空复杂度分析:

时间复杂度:为O(N); N是树的节点个数

空间复杂度: 为 O(N); 开辟的栈空间;

解法二:用stack容器

也就是前序遍历,只不过是使用的deque容器的push_front() 方法每次在第一个元素插入 遍历结束后再把元素赋值给vector容器.

class Solution {
public:
    vector<int> postorder(Node* root) {

        stack<Node* > s;
        deque<int> ans;
        if (!root) return vector<int>();
        s.push(root);
        while (!s.empty() ) {
           Node * temp = s.top();
           s.pop();
           ans.push_front(temp -> val);
            //正向遍历 孩子数组;让最左孩子先进栈
           for (auto loop : temp -> children) {
               s.push(loop);
           }
        }

        vector <int> ret(ans.begin(),ans.end());
        return ret;
    }
};
时空复杂度分析:

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

空间复杂度: 使用了三个容器来存储节点或节点数据为O(3N) 去掉项数 为O(N);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值