代码随想录算法训练营第十五天(补充题目) | 429.N叉树的层序遍历,515.在每个树行中找最大值,116.填充每个节点的下一个右侧节点指针,117.填充每个节点的下一个右侧节点指针II

在这里插入图片描述
和二叉树的层序遍历类似,就是层序遍历给每个子树的父节点选后继节点时候需要遍历节点结构体里面的节点数组,写法稍微有点不同

/*
// 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<vector<int>> levelOrder(Node* root) {
        vector<vector<int>> res;
        queue<Node*> levelOrderQueue;

        if(root == NULL){
           return res;
        } 
        levelOrderQueue.push(root);

        while(!levelOrderQueue.empty()){
             int size = levelOrderQueue.size();
             vector<int> resVec;
             while(size--){
                   Node * node = levelOrderQueue.front();
                   levelOrderQueue.pop();
                   resVec.push_back(node->val);
                  for(auto i : node->children){
                        if(i != NULL){
                           levelOrderQueue.push(i);
                        }
                   }
             }
             res.push_back(resVec);
                       
        }
        return res;
    }
};

在这里插入图片描述
层序遍历找每一层的最大值,在每一层做快排,获取最大值,O(n(logn)^2 )。 可以在快排处优化,三元运算符找最大值,这样时间复杂度就是层序遍历的时间复杂度O(n)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    static bool comp(const int & a,const int & b){
            return a > b;
    }
    vector<int> largestValues(TreeNode* root) {
         vector<int> res;
         queue<TreeNode*> q;
        
         if(root == NULL){
            return res;
         }
         q.push(root);
         while(!q.empty()){
             int size = q.size();
             vector<int> resVec;

             while(size--){
                TreeNode * node = q.front();
                q.pop();
                resVec.push_back(node->val);
                if(node->left){
                   q.push(node->left);
                }
                if(node->right){
                   q.push(node->right);
                }
             }
             sort(resVec.begin(),resVec.end(),comp);
             res.push_back(resVec[0]);
         }
         return res;
    }
};

在这里插入图片描述
在这里插入图片描述
层序遍历,如果不谈优化解法的话,就这样了。。。

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        queue<Node*> levelOrderQueue;
        if(root == NULL){
           return root;
        }

        levelOrderQueue.push(root);
        while(!levelOrderQueue.empty()){
            int size = levelOrderQueue.size();
            vector<Node*> levelVec;

            while(size--){
                 Node* node = levelOrderQueue.front();
                 levelOrderQueue.pop();
                 levelVec.push_back(node);
                 if(node->left){
                   levelOrderQueue.push(node->left);
                 }
                 if(node->right){
                    levelOrderQueue.push(node->right);
                 }
            } 
            for(int i = 0;i< levelVec.size();i++){
                if(i + 1 < levelVec.size()){
                    levelVec[i]->next = levelVec[i+1];
                }else{
                    levelVec[i]->next = NULL;
                }
            }
        }
        
        return root;
    }
};

在这里插入图片描述
在这里插入图片描述

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        queue<Node*> levelOrderQueue;
        if (root == NULL) {
            return root;
        }
        levelOrderQueue.push(root);
        while (!levelOrderQueue.empty()) {
            int size = levelOrderQueue.size();
            vector<Node*> resVec;
            while (size--) {
                Node* node = levelOrderQueue.front();
                levelOrderQueue.pop();
                resVec.push_back(node);
                if (node->left) {
                    levelOrderQueue.push(node->left);
                }

                if (node->right) {
                    levelOrderQueue.push(node->right);
                }
            }

            for (int i = 0; i < resVec.size(); i++) {
                if (i + 1 < resVec.size()) {
                    resVec[i]->next = resVec[i + 1];
                } else {
                    resVec[i]->next = NULL;
                }
            }
        }
        return root;
    }
};
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值