题目一
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
解题思路:
该题考察的是二叉树的遍历算法,不同于我们熟悉的前序、中序、后序遍历算法,该题考察层序遍历算法,不能仅靠我们的递归实现。这里需要用一个队列来帮助我们实现,每次访问一个节点,存入队列,然后操作,然后将该节点的左右孩子存入队列。
解题代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
//二叉树的层序遍历,这里通过分析需要一个队列来辅助实现算法
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> res;
if(root==nullptr)
return res;
deque<TreeNode*> dequeTreeNode; //构建一个队列(deque为STL的双向队列)存放二叉树的结点
dequeTreeNode.push_back(root); //把根结点放入队列
while(dequeTreeNode.size())
{
TreeNode* p=dequeTreeNode.front(); //取出队列首的元素(结点)
dequeTreeNode.pop_front();
res.push_back(p->val); //将每个结点的值存入vector容器
if(p->left)
dequeTreeNode.push_back(p->left);//将p的左孩子结点存入队列尾部
if(p->right)
dequeTreeNode.push_back(p->right);
}
return res;
}
};
题目二
从上到下按层打印二叉树,同一层的节点按照从左到右的顺序打印,每一层打印一行。例如,打印如图中二叉树:
解题思路:
同样是用队列实现
解题代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res;
if(pRoot==nullptr)
return res;
queue<TreeNode*> q; //q为单向队列
q.push(pRoot);
while(!q.empty())
{
int lo=0, hi=q.size(); //lo和hi相当于索引,代表处理完该行后,下一行节点的个数
vector<int> ans;
while(lo<hi)
{
TreeNode* p=q.front();
q.pop();
ans.push_back(p->val);
if(p->left)
q.push(p->left);
if(p->right)
q.push(p->right);
lo++;
}
res.push_back(ans);
}
return res;
}
};
题目三
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路:
需要用两个栈来实现。
解题代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res;
if(pRoot==nullptr)
return res;
stack<TreeNode*> stack1,stack2;
stack1.push(pRoot);
TreeNode* p;
while(!stack1.empty() || !stack2.empty())
{
vector<int> data;
if(!stack1.empty()) //stack1存放奇数层的两个孩子,先放左孩子,再放右孩子
{ //因为下一层(偶数层)打印的时候,从右到左打印,因此左孩子先进栈后出来
while(!stack1.empty())
{
p=stack1.top();
stack1.pop();
data.push_back(p->val);
if(p->left!=nullptr)
stack2.push(p->left);
if(p->right!=nullptr)
stack2.push(p->right);
}
res.push_back(data);
}
else if(!stack2.empty()) //Stack2存放偶数层的孩子,先放右孩子,再放做孩子
{
while(!stack2.empty())
{
p=stack2.top();
stack2.pop();
data.push_back(p->val);
if(p->right!=nullptr)
stack1.push(p->right);
if(p->left!=nullptr)
stack1.push(p->left);
}
res.push_back(data);
}
}
return res;
}
};