二叉树层次遍历

举报
Linux猿 发表于 2022/02/20 12:22:08 2022/02/20
【摘要】 CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


二叉树层次遍历是一种常见的二叉树遍历算法,通常使用广度优先搜索来实现,下面来看一下吧!

一、题目描述

给定一棵二叉树的根节点 root ,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。

提示:

树中节点数目在范围 [0, 2000] 内;

-1000 <= Node.val <= 1000;

二、测试样例

图1 二叉树

输入:root = [3,9,20,null,null,15,7]

输出:[[3],[9,20],[15,7]]

其中,第一层的结点为 [3] ,第二层的结点为 [9,20],第三层的结点为[15,7]。

三、算法思路

本题考查二叉树的层次遍历,可以通过广度优先搜索算法实现。

因为题目要求按层输出,所以在使用广度优先搜索算法的时候,需要区分二叉树的不同层,这里使用 pair 将结点与所在的层进行绑定,如果是子节点,则将在父节点层的基础上层数加 1。

四、代码实现

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

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:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(!root) return {};
        vector<vector<int>> ans;
        typedef pair<TreeNode*, int> PAIR;
        queue<PAIR>que;
        //pair 的第二个元素表示结点位于第几层
        que.push(PAIR(root, 0));
        while(!que.empty()) {
            PAIR curt = que.front();
            que.pop();
            if(ans.size() <= curt.second) {
                ans.push_back(vector<int>());
            }
            ans[curt.second].push_back(curt.first->val);
            if(curt.first->left) {
                que.push(PAIR(curt.first->left, curt.second + 1));
            }

            if(curt.first->right) {
                que.push(PAIR(curt.first->right, curt.second + 1));
            }
        }
        return ans;
    }
};

/**
 * 创建二叉树,用于测试
 */
TreeNode* createBinary() {
    TreeNode* root = new(TreeNode);
    TreeNode* p1 = new(TreeNode);
    TreeNode* p2 = new(TreeNode);
    TreeNode* p3 = new(TreeNode);
    TreeNode* p4 = new(TreeNode);

    root->left = p1;
    root->right = p2;
    root->val = 3;

    p1->left = nullptr;
    p1->right = nullptr;
    p1->val = 9;

    p2->left = p3;
    p2->right = p4;
    p2->val = 20;

    p3->left = nullptr;
    p3->right = nullptr;
    p3->val = 15;

    p4->left = nullptr;
    p4->right = nullptr;
    p4->val = 7;
    return root;
}

int main()
{
    TreeNode* root = createBinary();

    Solution obj;
    vector<vector<int>> ans = obj.levelOrder(root);

    //输出结果
    for(int i = 0; i < (int)ans.size(); ++i) {
        for(int j = 0; j < (int)ans[i].size(); ++j) {
            cout<<ans[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

测试输出为:

3
9 20
15 7

五、复杂度分析

5.1 时间复杂度

时间复杂度:O(n),n 为二叉树结点数,每一个结点访问一次,所以时间复杂度为 O(n)。

5.2 空间复杂度

空间复杂度:O(n),在上述算法中,用到了一个队列,队列最深不超过 n,所以空间复杂度为O(n)。

六、总结

需要理解二叉树层次遍历的原理,掌握广度优先搜索算法,只需要对算法进行些许更改即可。


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。