• 把二叉树打印成多行


    题目描述

    从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
     
    思路1:利用二叉树层序遍历的思想。
    具体实现: 先设置一个二维数组vec,用来存放每一层的结点值,即val。
    若该二叉树是个空树,就返回一个vec。
    若不是空树,再设置一个队列用来存放结点。一开始将根结点入队。
     
    当队列非空的时候,需要在循环内部遍历。另外设置两个变量分别为队首lo和队尾hi。再设置一个一维数组c,用来存放每层的结点。
    每遍历一个结点的时候,队首需要+1,所以在循环内部再设置一个循环。
    设置一个结点变量*t等于队列中的队首结点,将该结点值加入到一维数组中,并将结点出队。
    若该结点有左孩子,将左孩子加入队列;若该节点有右孩子,将右孩子加入队列。
    当从队首遍历到队尾,退出循环。将一维数组中保存的结点值,加入到二维数组中。
     
     
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
            vector<vector<int> > Print(TreeNode* pRoot) {
            	vector<vector<int>> vec;
                if(pRoot==NULL)	return vec;
                
                queue<TreeNode *> q;
                q.push(pRoot);
                while(!q.empty()) {
                    int lo=0,hi=q.size();
                    vector<int> c;
                    while(lo++ < hi) {
                        TreeNode *t=q.front();
                        q.pop();
                        c.push_back(t->val);
                        if(t->left) q.push(t->left);
                        if(t->right) q.push(t->right);
                    }
                    vec.push_back(c);
                }
                return vec;
            }
        
    };
    

      

    思路二:思路基本和思路一一样,但是少了变量、

    class Solution {
    public:
        vector<vector<int> > Print(TreeNode* pRoot) {
            vector<vector<int> > ret;
            queue<TreeNode*> que;
            if(pRoot) que.push(pRoot);
            while(!que.empty()){
                vector<int> tmp;
                int n = que.size();
                while(n--){
                    TreeNode* node = que.front();
                    tmp.push_back(node->val);
                    if(node->left) que.push(node->left);
                    if(node->right) que.push(node->right);
                    que.pop();
                }
                ret.push_back(tmp);
            }
            return ret;
        }
    };
    

      

    思路三:两个队列交错打印

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
            vector<vector<int> > Print(TreeNode* pRoot) {
            	vector<vector<int>> vec;
                if(pRoot==NULL)	return vec;
                
                queue<TreeNode *> q1;
                queue<TreeNode *> q2;
                q1.push(pRoot);
                while(!q1.empty() || !q2.empty()) {
                    vector<int> v1;
                    vector<int> v2;
                    while(!q1.empty()) {
                        v1.push_back(q1.front()->val);
                        if(q1.front()->left!=NULL) q2.push(q1.front()->left);
                        if(q1.front()->right!=NULL) q2.push(q1.front()->right);
                        q1.pop();
                    }
                    if(v1.size()!=0) 
                    	vec.push_back(v1);
                    while(!q2.empty()) {
                        v2.push_back(q2.front()->val);
                        if(q2.front()->left!=NULL) q1.push(q2.front()->left);
                        if(q2.front()->right!=NULL) q1.push(q2.front()->right);
                    	q2.pop();
                    }
                    if(v2.size()!=0)
                        vec.push_back(v2);
                }
                return vec;
            }
        
    };
    

      

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    遍历数组
    push/pop和unshift/shift
    完全卸载oracle11g
    截图神器-snipaste
    截图神器-snipaste
    VS2015 +.NETMVC5 +EF实践
    VS2015 +.NETMVC5 +EF实践
    github 客户端总是登录失败,提示密码错误
    github 客户端总是登录失败,提示密码错误
    【.NET MVC分页】.NET MVC 使用pagelist 分页
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7477062.html
Copyright © 2020-2023  润新知