二叉树的层次遍历

题目描述

编一个程序,读入用户输入的一串先序遍历字符串,根据输入建立一棵二叉树, 并输出该二叉树的层次遍历序列。层次遍历是指逐层访问,每一层又按从左到右的次序访问结点。

输入

输入包括1行字符串,长度不超过100。

输出

输出二叉树的层次遍历序列。每个结点先输出一个空格,然后再跟着输出结点的数据。

样例输入

12##3##

样例输出

 1 2 3

 

基本思路: 应用队列存储树的节点,先写入根节点,再写入左右子节点。(若子节点为NULL则不写入) 在对头元素出队前输出其数据域数据,直到队列为空时遍历结束。

注意事项:  队列数据域应设为指向二叉树的指针

 

代码部分:

 #include<stdio.h>
 #include<stdlib.h>
 #include<iostream>
 using namespace std;
 struct tree
 {
	char data;
	struct tree*left;
	struct tree*right;
 };
 
 struct list
 {
 	struct tree*data;
 	struct list*next;
 };
 
 typedef struct list* link;
 
  struct AC
 {
 	link A;
 	link C;
 };
 
 
 typedef struct tree* T; 
 typedef struct AC* ac;
 
 
  ac creat()
 {
   ac t=(ac)malloc(sizeof(struct AC));
   t->A=t->C=(link)malloc(sizeof(struct list));
   t->A->next=NULL;
   return t;
 }
 
 void push(ac &l,T e)
 {
 	link temp=(link)malloc(sizeof(struct list));
 	temp->data=e;
 	temp->next=NULL;
 	l->C->next=temp;
 	l->C=temp;
 }
 
 
 void pop(ac &l)
 {
 	link temp=l->A->next;
 	l->A->next=temp->next;
 	if(temp==l->C)
 	l->C=l->A;
	delete temp;
 }
 
 
 char top(ac l)
 {
 	T m=l->A->next->data;
 	return m->data;
 }
 
 
  void BiTree(T &tree)
 {
 	char ch;
 	cin>>ch;
 	if(ch=='#')
 	tree=NULL;
 	else
 	{
	  tree=(T)malloc(sizeof(struct tree));
	  tree->data=ch;
	  BiTree(tree->left);
	  BiTree(tree->right);
    }
 }
 
 
 int empty(ac l)
 {
 	if(l->A==l->C)
 	return 0;
 	return 1;
 }
 
 void fx(ac k)
 {
    T temp;
 	while(empty(k))
   {
    temp=k->A->next->data;
    if(temp->left)
 	push(k,temp->left);
 	if(temp->right)
 	push(k,temp->right);
    printf(" %c",top(k));
    pop(k);
   }
 }
 
 int main()
{
	ac x=creat();
	T tree;
	BiTree(tree);
	if(tree!=NULL)   //这个判断语句可有可无,根据实际oj环境而定 
	{
	push(x,tree);
	fx(x);
    }
	return 0;
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值