【剑指offer】26.把二叉树打印成多行

总目录:

算法之旅导航目录

 

1.问题描述

给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。

例如:
给定的二叉树是{1,2,3,#,#,4,5} 

该二叉树多行打印层序遍历的结果是

[
[1],
[2,3],
[4,5]
]
数据范围:二叉树的节点数 0≤n≤10000≤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 };
View Code

 递归,标注层号

 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 };
View Code

 

posted @ 2022-11-13 14:51  啊原来是这样呀  阅读(23)  评论(0)    收藏  举报