【100题】第十六题(层序打印树的节点)

一,题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入

       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;
} 



posted @ 2012-02-22 17:32  MXi4oyu  阅读(164)  评论(0编辑  收藏  举报