把二叉树打印成多行

题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
 
思路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;
        }
    
};

  

拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
原文地址:https://www.cnblogs.com/dd2hm/p/7477062.html