剑指 Offer 32 - I. 从上到下打印二叉树
题目描述
很明显的一道二叉树的层次遍历,用队列实现
C++解法
/* 二叉树镜像
*题目:完成一个函数,输入一个二叉树,输出该二叉树的镜像*/
#include<cstdio>
#include<queue>
#include<iostream>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};
//打印二叉树
static void printTree(TreeNode* node)
{
if (node != nullptr)
{
printTree(node->left);
cout << node->val << " ";
printTree(node->right);
}
}
void levelOrder(TreeNode* root) {
if (root == nullptr)
return ;
queue<TreeNode*>que;
que.push(root);
while (!que.empty())
{
int size = que.size();
auto top = que.front();
que.pop();
cout << top->val<<" ";
//result.push_back(top->val);
if (top->left)
que.push(top->left);
if (top->right)
que.push(top->right);
}
}
测试代码
///* 完全二叉树:出来叶子节点,其他节点都有两个子节点
// * 8
// * / \
// 6 10
// / \ / \
// 5 7 9 11
// */
void test1()
{
cout << "测试完全二叉树" << endl;
TreeNode* root = new TreeNode(8);
root->left = new TreeNode(6);
root->right= new TreeNode(10);
root->left->left = new TreeNode(5);
root->left->right = new TreeNode(7);
root->right->left = new TreeNode(9);
root->right->right = new TreeNode(11);
printTree(root);
cout << endl;
cout << "从上打印二叉树为:"<<endl;
levelOrder(root);
}
/* 8
/
6
/
5
/
9 */
void test2()
{
cout << "测试二叉树" << endl;
TreeNode* root = new TreeNode(8);
root->left = new TreeNode(6);
root->left->left = new TreeNode(5);
root->left->left->left = new TreeNode(9);
printTree(root);
cout << endl;
cout << "从上打印二叉树为:" << endl;
levelOrder(root);
}
void test3()
{
cout << "测试空节点" << endl;
printTree(nullptr);
cout << "从上打印二叉树为:" << endl;
levelOrder(nullptr);
}
int main()
{
test1();
cout << endl;
test2();
cout << endl;
test3();
cout << endl;
return 0;
}
结果
剑指 Offer 32 - II. 从上到下打印二叉树 II
题目解析
与上题的区别就在于,要记录一下,每层的节点数,以及队列中存在的节点数。
代码
class Solution {
public:
vector<int>result;
vector<vector<int>> res;
vector<vector<int>> levelOrder(TreeNode* root) {
if(root==nullptr)
return {};
queue<TreeNode *>que;
que.push(root);
int count=0;
int last=1;//根节点是1
while(!que.empty())
{
int size=que.size();
auto top=que.front();
que.pop();
last--;
result.push_back(top->val);
if(top->left)
{
que.push(top->left);
count++;
}
if(top->right)
{
que.push(top->right);
count++;
}
if(last==0)
{
res.push_back(result);
last=count;
count=0;
result.clear();
}
}
return res;
}
};
剑指 Offer 32 - III. 从上到下打印二叉树 III
题目描述
代码
class Solution {
public:
vector<int>result;
vector<vector<int>> res;
vector<vector<int>> levelOrder(TreeNode* root) {
if(root==nullptr)
return {};
queue<TreeNode *>que;
que.push(root);
int count=0;
int last=1;
int num=1;
while(!que.empty())
{
int size=que.size();
auto top=que.front();
que.pop();
last--;
result.push_back(top->val);
if(top->left)
{
que.push(top->left);
count++;
}
if(top->right)
{
que.push(top->right);
count++;
}
if(last==0 )
{
if(num%2!=0)
res.push_back(result);
else
{
reverse(result.begin(),result.end());
res.push_back(result);
}
last=count;
count=0;
num++;
result.clear();
}
}
return res;
}
};