剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6,7]]
1 题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
2 思路和方法
先给定一个二叉树的样式:
输出的样式是:[[1], [3,2], [4,5,6,7]]。包含以下信息: (1)每一层所包含的树节点;(2)偶数层的树节点需倒序。
思路: 面对要求的偶数层倒序,亦有两种解题思路,第一种是:获取到所有节点的值后,将偶数层的节点值倒序(先存right,再存left实现倒序)。第二种则是在获取节点的值的时候就倒序存入。定义两堆栈stack1和stack2,在遍历当前层节点的同时!stack1.empty() TreeNode *data=stack1.top();,存储下一层的节点(stack2.push(data->right),stack2.push(data->left)),以此类推,!stack2.empty() TreeNode *data=stack2.top();,存储下一层的节点(stack1.push(data->left),stack2.push(data->right))。
3 C++核心代码
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>> result; 15 if(pRoot==nullptr) 16 return result; 17 stack<TreeNode*> stack1,stack2;//分别存奇数和偶数层 18 stack1.push(pRoot); 19 while(!stack1.empty() || !stack2.empty()){ 20 if(!stack1.empty()){ 21 vector<int> temp; 22 while(!stack1.empty()){ 23 TreeNode *data=stack1.top(); 24 stack1.pop(); 25 temp.push_back(data->val); 26 if(data->left!=nullptr) 27 stack2.push(data->left); 28 if(data->right!=nullptr) 29 stack2.push(data->right); 30 } 31 result.push_back(temp); 32 } 33 if(!stack2.empty()){ 34 vector<int> temp; 35 while(!stack2.empty()){ 36 TreeNode *data=stack2.top(); 37 stack2.pop(); 38 temp.push_back(data->val); 39 if(data->right!=nullptr) 40 stack1.push(data->right); 41 if(data->left!=nullptr) 42 stack1.push(data->left); 43 } 44 result.push_back(temp); 45 } 46 } 47 return result; 48 } 49 };
参考资料
https://blog.csdn.net/u010005281/article/details/79759926