编程之美上的题目。
问题1:给定一棵二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一行将单输出一行),每一层要求访问的顺序为从左向右,并将节点依次编号。
问题2:写一个函数,打印二叉树中某层次的节点(从左向右),其中根结点为第1层。
#include<iostream>
#include<queue>
using namespace std;
struct Tnode
{
Tnode * leftChild;
Tnode * rightChild;
int value;
Tnode():leftChild(NULL),rightChild(NULL)
{
value=0;
}
Tnode(int i):leftChild(NULL),rightChild(NULL)
{
value=i;
}
};
//代码之美上的。输出第level层的所有元素
void printNodeAtLevel(Tnode * root, int level)
{
if(root==NULL||level<0)
{
return ;
}
if(level==1)
{
cout<<root->value<<" ";
return ;
}
printNodeAtLevel(root->leftChild,level-1);
printNodeAtLevel(root->rightChild,level-1);
}
int main()
{
//建树
Tnode * node1=new Tnode(1);
Tnode * node2= new Tnode(2);
Tnode * node3= new Tnode(3);
Tnode * node4= new Tnode(4);
Tnode * node5= new Tnode(5);
Tnode * node6= new Tnode(6);
Tnode * node7= new Tnode(7);
Tnode * node8= new Tnode(8);
node1->leftChild=node2;
node1->rightChild=node3;
node2->leftChild=node4;
node2->rightChild=node5;
node3->rightChild=node6;
node5->leftChild=node7;
node5->rightChild=node8;
//按层序遍历二叉树,并在每一层所有元素的后面打印一个换行符
//编程之美上写的是类似递归的思想,其实也是在用递归栈来记录层数,
//那么不如自己用个队列来实时追踪当前元素所在层
queue<Tnode*> que;
queue<int> level;//用一个辅助队列记录当前元素的所在层
que.push(node1);
level.push(1);
int currentLevel=1;
while(!que.empty())
{
Tnode * temp=que.front();
que.pop();
int l=level.front();
level.pop();
if(currentLevel<l)
{
cout<<endl;
currentLevel=l;
}
cout<<temp->value<<" ";
if(temp->leftChild!=NULL)
{
que.push(temp->leftChild);
level.push(l+1);
}
if(temp->rightChild!=NULL)
{
que.push(temp->rightChild);
level.push(l+1);
}
}
cout<<endl;
// printNodeAtLevel(node1,3);
return 0;
}