栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

二叉树打印成多行

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二叉树打印成多行

描述

给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出。每一层输出一行。
例如:
给定的二叉树是{1,2,3,#,#,4,5}

返回值:[[1],[2,3],[4,5]]

方法1 非递归层序遍历

首先处理特殊情况,比如指针为空的情况,直接返回空结果[] 维护一个队列,其中存储的信息是当前层的结点指针,队列一直在第二个while循环内重复的工作就是出队当前队首结点,同时将其左右子节点入队。 在层与层之间,通过第二次while循环之前的当前队列容量大小来控制层之间的间隔。 层序遍历进行每一层的结点添加统计。

class Solution {
public:
        vector > Print(TreeNode* pRoot) {
            if(pRoot==NULL) return {};                // 指针为空的情况处理
            vector> res;
            queue q;                       // 采用队列非递归的方式进行层序遍历
            TreeNode* p = pRoot;
            q.push(p);                                // 首先将根节点入队
            while(!q.empty()) {                       // 判断当前层是否为空
                vector level;
                int n = q.size();                     // 获取当前层内的结点数量
                while(n){                             // 对当前层内每一个结点进行左右子树的访问
                    TreeNode* a = q.front();          // 队首按序出列即当前层的vector内容
                    if(a->left) q.push(a->left);      // 左孩子入队
                    if(a->right)q.push(a->right);     // 右孩子入队
                    q.pop();                          // 当前层的结点指针出队
                    level.push_back(a->val);          // 将当前层结点记录到本层的vector中
                    n--;
                }
                res.push_back(level);                 // 收集每一层的vector整合为最终结果
            }
            return res;
        }
    
};

其中,n标志了本层结点个数,vector<> q在当前层可以起到记录下一层结点个数的功能。

复杂度分析

时间复杂度:O(N),每个节点进出队列一次
空间复杂度:O(N),使用了树状结构相当结点的空间,虽然小于N但是也是N的量级的

方法2 前序遍历记录深度

我们通过传统的前序遍历的方式,通过记录深度来判定结点对应的值应该加入到哪一个序列中。

class Solution {
public:
        vector > res;
        vector > Print(TreeNode* pRoot) {
            PrintLevel(pRoot, 0);
            return res;
        }
    
        void PrintLevel(TreeNode* pRoot,int level){
            if(pRoot == NULL){
                return;
            }

            if(res.size() < level + 1){
                res.push_back({});
            }
            res[level].push_back(pRoot->val);
            PrintLevel(pRoot->left,level+1);
            PrintLevel(pRoot->right,level+1);
        }
};

其中level记录了当前递归位置的结点需要加到res的哪一层容器中。

侵删

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312357.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号