【剑指offer】26.把二叉树打印成多行
总目录:
1.问题描述
给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。
例如:
 给定的二叉树是{1,2,3,#,#,4,5} 
该二叉树多行打印层序遍历的结果是
[
[1],
[2,3],
[4,5]
]
数据范围:二叉树的节点数 0≤n≤1000,0≤val≤1000
要求:空间复杂度 O(n),时间复杂度 O(n)
2.问题分析
本体难度还不如之字形打印。。。
1广度优先搜索,或者叫层序迭代
使用队列,每次迭代开始时队列的长度就是当前层节点的数量,将每个节点出队并将其子节点入队,对出队的节点展开处理
2递归
记录递归到了第几层
3.代码实例
广度优先搜索、层序迭代
 
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solution { 12 public: 13 vector<vector<int>> Print(TreeNode* pRoot) { 14 vector<vector<int>> ret; 15 if (!pRoot) { 16 return ret; 17 } 18 19 queue<TreeNode*> pQ; 20 pQ.push(pRoot); 21 22 int curTreeLevel = 0; 23 int nodeNumInLevel = 0; 24 while (!pQ.empty()) { 25 //准备空间 26 ret.push_back(vector<int>{}); 27 nodeNumInLevel = pQ.size(); 28 29 //逐个取出当前层的节点,并压入下层的节点 30 for (int i = 0; i < nodeNumInLevel; i++) { 31 auto* pCur = pQ.front(); 32 pQ.pop(); 33 34 ret[curTreeLevel].push_back(pCur->val); 35 36 //压入下层节点 37 if(pCur->left){ 38 pQ.push(pCur->left); 39 } 40 if(pCur->right){ 41 pQ.push(pCur->right); 42 } 43 } 44 45 //层序改变 46 curTreeLevel++; 47 } 48 49 return ret; 50 } 51 };
递归,标注层号
 
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solution { 12 public: 13 void recurve(TreeNode* root, vector<vector<int>>& ret, int levelIndex) { 14 //中止条件 15 if (!root) { 16 return; 17 } 18 19 //本层逻辑 20 //尚无本层buffer 21 while (ret.size() < levelIndex) { 22 ret.push_back(vector<int> {}); 23 } 24 //将本节点数值存入指定层 25 ret[levelIndex - 1].push_back(root->val); 26 27 //递归调用 28 recurve(root->left, ret, levelIndex + 1); 29 recurve(root->right, ret, levelIndex + 1); 30 } 31 32 vector<vector<int>> Print(TreeNode* pRoot) { 33 vector<vector<int>> ret; 34 if (!pRoot) { 35 return ret; 36 } 37 38 recurve(pRoot, ret, 1); 39 40 return ret; 41 } 42 };
 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号