力扣刷题之二叉树的层序遍历

力扣刷题之二叉树的层序遍历,第1张

                                                  Welcome to you每日一刷系列


二叉树的层序遍历

二叉树的层序遍历II

二叉树的右视图

二叉树的层平均值

N叉树的层序遍历

在每个树行中找最大值

填充每个节点的下一个右侧节点指针

填充每个节点的下一个右侧节点指针II

二叉树的最大深度

二叉树的最小深度


二叉树的层序遍历

广度优先搜索

我们可以用一种巧妙的方法修改广度优先搜索:

  • 首先根元素入队
  • 当队列不为空的时候

       1.求当前队列的长度 Si
       2.依次从队列中取 Si 个元素进行拓展,然后进入下一次迭代

class Solution {
public:
    vector> levelOrder(TreeNode* root) { 
     //初始化队列同时将第一层节点加入队列中,即根节点
      queue az;
      vector> sz;
      if(root==nullptr)
      {
          return sz;
      }
      az.push(root);

      //外层的while循环迭代的是层数
      while(!az.empty())
      {
       //记录当前队列大小
          int size=az.size();
          vector a;
           //遍历这一层的所有节点
          for(int i=0;ival);
              if(node->left) az.push(node->left);
              if(node->right)az.push(node->right);
          }
          sz.push_back(a);
      }
      return sz;
    }
};

大家请记住这个模板,后面的几个练习题,都是在这个上面稍作更改.

二叉树的层序遍历II

相对于上面的题目,我们就需要把数组翻转一下就好了.

class Solution {
public:
    vector> levelOrderBottom(TreeNode* root) {
         vector> az;
         queue sz;
          if(root==nullptr)
          {
              return az;
          }
          sz.push(root);
           
         while(!sz.empty())
         {
             vector a;
             int size=sz.size();
             for(int i=0;ival);
             if(node->left) sz.push(node->left);
             if(node->right) sz.push(node->right);
         }
         az.push_back(a);
         }
         reverse(az.begin(),az.end());
        return az;
    }
};
二叉树的右视图

层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。


class Solution {
public:
    vector rightSideView(TreeNode* root) {
    vector az;
    queue sz;
    if(root==nullptr)
    {
        return az;
    }
    sz.push(root);
    while(!sz.empty())
    {
        int size=sz.size();
        for(int i=0;ival);
            }
            if(node->left)sz.push(node->left);
            if(node->right)sz.push(node->right);
        }
    }
    return az;
    }
};
二叉树的层平均值

本题就是层序遍历的时候把一层求个总和在取一个均值。


class Solution {
public:
    vector averageOfLevels(TreeNode* root) {
     vector az;
     queue sz;
     if(root==nullptr)
{
    return az;
}     sz.push(root);
     while(!sz.empty())
    {
         double sum=0;
        int size=sz.size();
        for(int i=0;ival;
            if(node->left)sz.push(node->left);
            if(node->right)sz.push(node->right);
        }
        az.push_back(sum/size);
    }
     return az;
    }
};
N叉树的层序遍历

 这题就是跟第一题基本一样的,只不过节点多了几个孩子

class Solution {
public:
    vector> levelOrder(Node* root) {
        vector> az;
        queue sz;
        if(root==nullptr){
            return az;
        }
        sz.push(root);
        while(!sz.empty())
        {
            vector a;
           int size=sz.size();
           for(int i=0;ival);
               for(int i=0;ichildren.size();i++)
               {
                   if(node->children[i])
                   sz.push(node->children[i]);
               }
           }
           az.push_back(a);

        }
        return az;
    }
};
在每个树行中找最大值

class Solution {
public:
    vector largestValues(TreeNode* root) {
    vector az;
    queue sz;
    if(root==nullptr)
    {
        return az;
    }
    sz.push(root);
    while(!sz.empty())
    {
        int size=sz.size();
        int max=INT_MIN;
       for(int i=0;inode->val?max:node->val;
          if(node->left) sz.push(node->left);
          if(node->right)sz.push(node->right);
       }
       az.push_back(max);
    }
    return az;
    }
};
填充每个节点的下一个右侧节点指针

回想一下二叉树的层次遍历,用广度优先实现的时候,就是层层遍历,每层临时遍历的节点都会放到一个队列中。


队列中保存了第 i 层节点的信息,我们利用这个特点,将队列中的元素都串联一遍就可以了。


class Solution {
    public Node connect(Node root) {
        if (root == null) {
            return root;
        }
        
        // 初始化队列同时将第一层节点加入队列中,即根节点
        Queue queue = new LinkedList(); 
        queue.add(root);
        
        // 外层的 while 循环迭代的是层数
        while (!queue.isEmpty()) {
            
            // 记录当前队列大小
            int size = queue.size();
            
            // 遍历这一层的所有节点
            for (int i = 0; i < size; i++) {
                
                // 从队首取出元素
                Node node = queue.poll();
                
                // 连接
                if (i < size - 1) {
                    node.next = queue.peek();
                }
                
                // 拓展下一层节点
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
        }
        
        // 返回根节点
        return root;
    }
}

填充每个节点的下一个右侧节点指针II

和上题是完全一样的

class Solution {
public:
    Node* connect(Node* root) {
        if (root == nullptr) {
            return root;
        }
        
        // 初始化队列同时将第一层节点加入队列中,即根节点
        queue Q;
        Q.push(root);
        
        // 外层的 while 循环迭代的是层数
        while (!Q.empty()) {
            
            // 记录当前队列大小
            int size = Q.size();
            
            // 遍历这一层的所有节点
            for(int i = 0; i < size; i++) {
                
                // 从队首取出元素
                Node* node = Q.front();
                Q.pop();
                
                // 连接
                if (i < size - 1) {
                    node->next = Q.front();
                }
                
                // 拓展下一层节点
                if (node->left != nullptr) {
                    Q.push(node->left);
                }
                if (node->right != nullptr) {
                    Q.push(node->right);
                }
            }
        }
        
        // 返回根节点
        return root;
    }
};
二叉树的最大深度

这题前面有讲过, 可以参考这篇博客:力扣刷题之二叉树的最大深度_skeet follower的博客-CSDN博客 

二叉树的最小深度

 

需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。


如果其中一个孩子为空则不是最低点

class Solution {
public:
    int minDepth(TreeNode* root) {
      queue az;
      if(root==nullptr)
      {
          return 0;
      }
      int depth=0;
      az.push(root);
      while(!az.empty())
      {
          int size=az.size();
          depth++;
          for(int i=0;ileft) az.push(node->left);
              if(node->right)az.push(node->right);
              if(node->right==nullptr&&node->left==nullptr)
              {
                  return depth;
              }
          }
      }
      return depth;
    }
};

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/606974.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存