【剑指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 };
递归
 
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 };
 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号