一,题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ \
6 10
/ \ / \
5 7 9 11
输出:8 6 10 5 7 9 11。
二,分析:
本题主要考察树的层序遍历,最常用的方法就是采用队列的形式。
按照,根左右的形式依次将元素弹入队列中。然后取出队列头部,再将头部的左右子树弹入队列中。这样就可以层序遍历整个二叉树。有些类似树的广度优先查找。
三,源码:
#include "stdio.h"
#include "malloc.h"
#include "stack.h"
struct node
{
int data;
node *right;
node *left;
};
node *root;
void insert(node *&root,int data)
{
if(root==NULL)
{
printf("%d\n",data);
root=(node*)malloc(sizeof(node));
root->data=data;
root->right=NULL;
root->left=NULL;
}
else
{
if(root->data<data)//要插入的数据 data大于节点 则插入右边
insert(root->right,data);
else
insert(root->left,data);
}
}
node *creatTree(int a[],int n)
{
int i;
for(i=0;i<n;i++)
insert(root,a[i]);
return root;
}
void leveltree(node *root)//层序遍历
{
if(!root)
return;
deque<node*> dequelist; //双端都可以插入的队列
dequelist.push_back(root); //插入一个元素到队列的尾部
while(dequelist.size())
{
node* pnode=dequelist.front();//获取队列的头
dequelist.pop_front();//弹出队列的头
printf("data=%d\n",pnode->data);
if(pnode->left)
dequelist.push_back(pnode->left); //若有左子树,把它的左子树压入队列中
if(pnode->right)
dequelist.push_back(pnode->right); //若有右子树,把它的右子树压入队列中
}
}
int main()
{
int a[]={8,6,5,7,10,9,11};
root=creatTree(a,7);
leveltree(root);//采用循环的方式
return 0;
}