C++二叉树的层序遍历(广度优先搜索)借助 队列 实现

阅前须知

这篇博客是关于二叉树的层序遍历详解,但是不涉及二叉树的基本定义及原理。
通过队列实现二叉树的层序遍历的各类题型,总结出来二叉树层序遍历的模板C++代码。
个人认为非常有价值


可以直接点击每一道题的题目,直达Leetcode。
参考代码随想客

Leetcode 102.二叉树的层序遍历

class Solution {
    
    
public:
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
    
    
        queue<TreeNode*> que;
        vector<vector<int>> res;
        
        if(root!=nullptr)
        {
    
    
            que.push(root);
        }
        while(!que.empty())
        {
    
    
            int size=que.size(); 
            vector<int> temp;  //每次都是新数组
            for(int i=0;i<size;i++)
            {
    
    
                TreeNode* node=que.front();  //因为每一次都会pop()掉,所以一直保持横向移动
                que.pop();  //pop()掉是为了同一层横向移动
                temp.push_back(node->val);
                if(node->left)
                {
    
    
                    que.push(node->left);
                }
                if(node->right)
                {
    
    
                    que.push(node->right);
                }
            }
            res.push_back(temp);
        }
        return res;
    }
};

Leetcode 107.二叉树的层序遍历Ⅱ

这道题和102相比,就多了最后一个reverse();

class Solution {
    
    
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) 
    {
    
    
        queue<TreeNode*> que;
        vector<vector<int>> res;
        if(root!=nullptr)
        {
    
    
            que.push(root);
        }
        while(!que.empty())
        {
    
    
            vector<int> temp;
            int size=que.size();
            for(int i=0;i<size;i++)
            {
    
    
                TreeNode* node=que.front();
                que.pop();
                temp.push_back(node->val);
                if(node->left)
                {
    
    
                    que.push(node->left);
                }
                if(node->right)
                {
    
    
                    que.push(node->right);
                }
            }
            res.push_back(temp);
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

Leetcode 199.二叉树的右视图

class Solution {
    
    
public:
    vector<int> rightSideView(TreeNode* root) 
    {
    
    
        //按照层序遍历,每一层判断是否为该层最后一个元素。
        vector<int> res;
        queue<TreeNode*> que;
        if(root!=nullptr)
        {
    
    
            que.push(root);
        }
        while(!que.empty())
        {
    
    
            int size=que.size();
            for(int i=0;i<size;i++)
            {
    
    
                TreeNode* node=que.front();
                que.pop();
        
                if(node->left)
                {
    
    
                    que.push(node->left);
                }
                if(node->right)
                {
    
    
                    que.push(node->right);
                }
                if(i==(size-1))
                {
    
    
                    res.push_back(node->val);
                }
            }
        }
        return res;
    }
};

Leetcode 637.二叉树的层平均值

class Solution {
    
    
public:
    vector<double> averageOfLevels(TreeNode* root) 
    {
    
    
        vector<double> res;
        queue<TreeNode*> que;
        if(root!=nullptr)
        {
    
    
            que.push(root);
        }
        while(!que.empty())
        {
    
    
            int size=que.size();
            double sum=0.0;
            for(int i=0;i<size;i++)
            {
    
    
                TreeNode* node=que.front();
                que.pop();
                sum+=node->val;
                if(node->left)
                {
    
    
                    que.push(node->left);
                }
                if(node->right)
                {
    
    
                    que.push(node->right);
                }
            }
            res.push_back(sum/size);
        }
        return res;
    }
};

Leetcode 429.N叉树的层序遍历

class Solution {
    
    
public:
    vector<vector<int>> levelOrder(Node* root) 
    {
    
    
        vector<vector<int>> res;
        queue<Node*> que;
        if(root!=nullptr)
        {
    
    
            que.push(root);
        }
        while(!que.empty())
        {
    
    
            int size=que.size();
            vector<int> temp;
            for(int i=0;i<size;i++)
            {
    
    
                Node* node=que.front();
                que.pop();
                temp.push_back(node->val);
                for(int i=0;i<node->children.size();i++)
                {
    
    
                    if(node->children[i])
                    {
    
    
                        que.push(node->children[i]);
                    }
                }
            }
            res.push_back(temp);
        }
        return res;

    }
};

Leetcode 515.在每个树行中找最大值

class Solution {
    
    
public:
    vector<int> largestValues(TreeNode* root) 
    {
    
    
        vector<int> res;
        queue<TreeNode*> que;
        if(root!=nullptr)
        {
    
    
            que.push(root);
        }
        while(!que.empty())
        {
    
    
            int size=que.size();
            int Max_Num=INT_MIN;
            for(int i=0;i<size;i++)
            {
    
    
                TreeNode* node=que.front();
                que.pop();
                Max_Num=max(Max_Num,node->val);
                if(node->left)
                {
    
    
                    que.push(node->left);
                }
                if(node->right)
                {
    
    
                    que.push(node->right);
                }
            }
            res.push_back(Max_Num);
        }
        return res;
    }
};

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

class Solution {
    
    
public:
    Node* connect(Node* root) 
    {
    
    
        
        queue<Node*> que;
        if(root!=nullptr)
        {
    
    
            que.push(root);
        }
        while(!que.empty())
        {
    
    
            Node* nodepre;
            Node* node;
            int size=que.size();
            for(int i=0;i<size;i++)
            {
    
    
                if(i==0)
                {
    
    
                    nodepre=que.front();
                    que.pop();
                    node=nodepre;
                }
                else
                {
    
    
                    node=que.front();
                    que.pop();
                    nodepre->next=node;
                    nodepre=nodepre->next;  //指针传递

                }
                if(node->left)
                {
    
    
                    que.push(node->left);
                }
                if(node->right)
                {
    
    
                    que.push(node->right);
                }
            }
        }
        return root;
    }
};

Leetcode 117.填充每个节点的下一个右侧节点指针Ⅱ

和116这一题有所区别:
这一题没有说是满二叉树
但是代码实现和116一模一样 原汁原味

class Solution {
    
    
public:
    Node* connect(Node* root) 
    {
    
    
        queue<Node*> que;
        if(root!=nullptr)
        {
    
    
            que.push(root);
        }
        while(!que.empty())
        {
    
    
            int size=que.size();
            Node* nodepre;
            Node* node;
            for(int i=0;i<size;i++)
            {
    
    
                if(i==0)
                {
    
    
                    nodepre=que.front();
                    que.pop();
                    node=nodepre;
                }
                else
                {
    
    
                    node=que.front();
                    que.pop();
                    nodepre->next=node;
                    nodepre=nodepre->next;
                }
                if(node->left)
                {
    
    
                    que.push(node->left);
                }
                if(node->right)
                {
    
    
                    que.push(node->right);
                }
            }
        }
        return root;
    }
};

Leetcode 104.二叉树的最大深度

这道题要算二叉树的最大深度,所以一样也采用层次遍历的模板,可以完美解决。

class Solution {
    
    
public:
    int maxDepth(TreeNode* root) 
    {
    
    
        queue<TreeNode*> que;
        int depth=0;
        if(root!=nullptr)
        {
    
    
            que.push(root);
        }
        while(!que.empty())
        {
    
    
            depth++;
            int size=que.size();
            TreeNode* node;
            for(int i=0;i<size;i++)
            {
    
    
                node=que.front();
                que.pop();
                if(node->left)
                {
    
    
                    que.push(node->left);
                } 
                if(node->right)
                {
    
    
                    que.push(node->right);
                }
            }
        }
        return depth;
    }
};

Leetcode 111.二叉树的最小深度

这道题要求二叉树的最小深度,那么什么时候说明截止了呢。只有当一个节点的左右孩子都为空时,说明这个节点时叶子节点。
所以本题依然是模板题,采用层次遍历的方法,加以修改就可以了。

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

Guess you like

Origin blog.csdn.net/weixin_45847364/article/details/121888674