《剑指offer》-逐层打印二叉树

简介: 题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。乍一看就是一个BFS,但是因为太久没刷题都忘记了要使用queue来作为空间存储容器了。先参考milolip的代码,写出这样的solution:class Solution {public: vector Pr...

题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

乍一看就是一个BFS,但是因为太久没刷题都忘记了要使用queue来作为空间存储容器了。

先参考milolip的代码,写出这样的solution:


class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > res;
        if(pRoot==NULL){
            return res;
        }
        
        queue<TreeNode*> Q;
        Q.push(pRoot);
        Q.push(NULL);
        vector<int> v;
        v.push_back(pRoot->val);
        res.push_back(v);
        v.clear();
        while (!Q.empty()){
            TreeNode* node = Q.front();
            Q.pop();
            if (node != NULL){
                //v.push_back(node->val);
                //cout << node->val << ends;
                if (node->left){
                    Q.push(node->left);
                    v.push_back(node->left->val);
                }
                if (node->right){
                    Q.push(node->right);
                    v.push_back(node->right->val);
                }
            }
            else if (!Q.empty()){
                //cout << "test " << endl;
                Q.push(NULL);
                res.push_back(v);
                v.clear();
                //cout << endl;
            }
        }
        return res;
    }
};

上面的代码并不太简洁的样子。

另一种写法是从评论区copy来的,又简洁,又非常直观清晰。两层while的嵌套,正好对应到数的层次遍历以及层内逐点遍历。而这种双层嵌套的循环其实并没有增加复杂度,和原来的复杂度是一样的。

class Solution_11 {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > res;

        if (pRoot == NULL){
            return res;
        }
        
        queue<TreeNode*> q;
        q.push(pRoot);

        while (!q.empty()){
            int lo = 0, hi = q.size();
            vector<int> v;
            while (lo++ < hi){
                TreeNode *t = q.front();
                q.pop();
                v.push_back(t->val);
                if (t->left){
                    q.push(t->left);
                }
                if (t->right){
                    q.push(t->right);
                }
            }
            res.push_back(v);
        }
        return res;
    }
};

测试代码;

void main_solution_11(){
    Solution_11 s = Solution_11();
    TreeNode* a = new TreeNode(8);
    TreeNode* b1 = new TreeNode(6);
    TreeNode* b2 = new TreeNode(10);
    TreeNode* c1 = new TreeNode(5);
    TreeNode* c2 = new TreeNode(7);
    TreeNode* c3 = new TreeNode(9);
    TreeNode* c4 = new TreeNode(1);

    a->left = b1;
    a->right = b2;

    b1->left = c1;
    b1->right = c2;
    b2->left = c3;
    b2->right = c4;

    vector<vector<int> > q = s.Print(a);
    for (int i = 0; i < q.size(); i++){
        for (int j = 0; j < q[i].size(); j++){
            if (j > 0){
                cout << " ";
            }
            cout << q[i][j];
        }
        cout << endl;
    }
}

int main(){
    main_solution_11();
    return 0;
}
目录
相关文章
|
SQL Java 关系型数据库
MyBatis-Plus分页插件和MyBatisX插件
MyBatis-Plus分页插件和MyBatisX插件
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
33254 201
如何保证分布式文件系统的数据一致性
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36823 22
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24905 16
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36824 15
重生之---我测阿里云U1实例(通用算力型)

热门文章

最新文章