数据结构实验之二叉树五:层序遍历
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点)。请建立二叉树并求二叉树的层次遍历序列。
Input
输入数据有多行,第一行是一个整数
t (t<1000)
,代表有
t
行测试数据。每行是一个长度小于
50
个字符的字符串。
Output
输出二叉树的层次遍历序列。
Example Input
2 abd,,eg,,,cf,,, xnl,,i,,u,,
Example Output
abcdefg xnuli
解题关键:层次遍历,即从上往下,从左到右。可以分为两步:
1.front=0,rear=0;将根节点地址依次放入q数组,执行rear++操作;
2.while(front!=rear)
1)取数组里的数据p=q[rear++],访问。
2)p->lchild非空,保存q[rear++]=q[front]->lchild;
3)p->rchild非空,保存q[rear++]=q[front]->rchild;
和队列的先进先出是一样的,利用数组模拟队列。
#include<stdio.h> #include<iostream> #include<stdlib.h> using namespace std; typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; char str[100]; int cnt; BiTree create() { BiTree T; if(str[cnt++] == ',') T=NULL; else { T=(BiTree)malloc(sizeof(BiTNode)); T->data = str[cnt-1]; T->lchild = create(); T->rchild = create(); } return T; } void ceng(BiTree T) { int i=0,j=1; cnt=0; BiTree q[100]; q[0]=T; while(i<j) { if(q[i]) { cout<< q[i]->data; q[j++]=q[i]->lchild; q[j++]=q[i]->rchild; } i++; } } int main() { int n; BiTree T; T=(BiTree)malloc(sizeof(BiTNode)); while(cin>>n) { for(int i=0;i<n;i++) { cin>>str; T=create(); ceng(T); cout<<endl; } } return 0; }