【剑指offer】13.从上往下打印二叉树

总目录:

算法之旅导航目录

 

1.问题描述

 不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。

 

 

 

2.问题分析

 1辅助队列法,参考前面两题的辅助队列做法

2递归,建立一个二维的vector,每个元素用来存储每层的节点值,递归函数需要输入当前层号


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 class Solution {
11   public:
12     vector<int> PrintFromTopToBottom(TreeNode* root) {
13         vector<int> printVec;
14 
15         //空树
16         if (!root) {
17             return printVec;
18         }
19 
20         //初始化队列
21         queue<TreeNode*> q;
22         q.push(root);
23 
24         //初始化当前层节点计数器
25         int nodeCount = 0;
26 
27         //逐层迭代
28         while (!q.empty()) {
29             //遍历当前层的所有节点
30             nodeCount = q.size();
31             for (int i = 0; i < nodeCount; i++) {
32                 auto* pNode = q.front();
33                 q.pop();
34 
35                 //本层逻辑,交换当前节点的左右节点
36                 printVec.push_back(pNode->val);
37 
38                 if (pNode->left) q.push(pNode->left);
39                 if (pNode->right) q.push(pNode->right);
40             }
41 
42             //本层结束
43         }
44 
45         return printVec;
46     }
47 };
View Code

 递归

 1 class Solution {
 2 public:
 3     void traverse(TreeNode* root, vector<vector<int>>& res, int depth) {
 4         if(root){
 5             //新的一层
 6             if(res.size() < depth)  
 7                 res.push_back(vector<int>{}); 
 8             //vector从0开始计数因此减1,在节点当前层的vector中插入节点
 9             res[depth - 1].push_back(root->val);
10         }
11         else
12             return;
13         //递归左右时进入下一层
14         traverse(root->left, res, depth + 1); 
15         traverse(root->right, res, depth + 1);
16     }
17     
18     vector<int> PrintFromTopToBottom(TreeNode* root) {
19         vector<int> res;
20         vector<vector<int> > temp;
21         if(root == NULL)
22             //如果是空,则直接返回空vector
23             return res; 
24         traverse(root, temp, 1);
25         //送入一维数组
26         for(int i = 0; i < temp.size(); i++)
27             for(int j = 0; j < temp[i].size(); j++)
28                 res.push_back(temp[i][j]);
29         return res;
30     }
31 };
View Code

 

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