7-1 二叉树的层次遍历 (25 分)
编写程序,要求实现(1)按先序遍历序列建立二叉树的二叉链表;(2)按层次遍历二叉树。
C++:
构成二叉链表的结点类代码如下:
typedef struct BiNode
{
char data; //结点数据域
struct BiNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
按加入空树信息的先序遍历序列建立二叉树的二叉链表代码提供如下:
//先序遍历序列建立二叉链表
void CreateBiTree(BiTree &T)
{
char ch;
cin >> ch;
if(ch=='#') T=NULL; //递归结束,建空树
else{
T=new BiTNode;
T->data=ch; //生成根结点
CreateBiTree(T->lchild); //递归创建左子树
CreateBiTree(T->rchild); //递归创建右子树
} //else
}
Java:
构成二叉链表的结点类代码如下:
class BtNode{
char data;
BtNode lchild,rchild;
}
按加入空树信息的先序遍历序列建立二叉树的二叉链表代码提供如下:
//先序遍历序列建立二叉链表
public static BtNode createBiTree() throws IOException{
char c=(char) System.in.read();
if(c=='#'){
return null;
}else{
BtNode bt=new BtNode();
bt.data=c;
bt.lchild=createBiTree();
bt.rchild=createBiTree();
return bt;
}
}
这里用c解题
输入格式:
输入一棵二叉树的加入空树信息的先序遍历序列,以#字符表示空树。
输出格式:
输出二叉树的层次遍历的序列。
输入样例:
ab#c##d##
输出样例:
abdc
#include <stdio.h>
#include <stdlib.h>
typedef struct BiNode
{
char data; //结点数据域
struct BiNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
typedef struct QNode{
BiTree data;
struct QNode *next;
}QNode, *QueuePrt;
typedef struct{
QueuePrt front;
QueuePrt rear;
}LinkQueue;
void InitQueue(LinkQueue &Q){
Q.front = Q.rear = (QueuePrt)malloc(sizeof(QueuePrt));
Q.front->next = NULL;
}
void EnQueue(LinkQueue &Q, BiTree q){
QueuePrt p = (QueuePrt)malloc(sizeof(QueuePrt));
p->data = q;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
BiTree DeleteQueue(LinkQueue &Q, BiTree q){
QueuePrt p;
if(Q.front == Q.rear) return 0;
p = Q.front->next;
q = p->data;
Q.front->next = p->next;
if(Q.rear == p) Q.rear = Q.front;
delete p;
return q; //返回树结点
}
//按加入空树信息的先序遍历序列建立二叉树的二叉链表代码提供如下:
//先序遍历序列建立二叉链表
void CreateBiTree(BiTree &T)
{
char ch;
scanf("%c", &ch);
if(ch=='#') T=NULL; //递归结束,建空树
else{
T=new BiTNode;
T->data=ch; //生成根结点
CreateBiTree(T->lchild); //递归创建左子树
CreateBiTree(T->rchild); //递归创建右子树
}
}
void InOderTraverse(BiTree T){
BiTree q;
LinkQueue Q;
InitQueue(Q);
q = T;
EnQueue(Q, q);
while(Q.front!=Q.rear){
q = DeleteQueue(Q, q);
printf("%c", q->data);
if(q->lchild) EnQueue(Q, q->lchild);
if(q->rchild) EnQueue(Q, q->rchild);
}
}
int main(){
BiTree T;
CreateBiTree(T);
InOderTraverse(T);
}
用先序建立二叉树后
6-9 二叉树的遍历
本题要求给定二叉树的4种遍历。
函数接口定义:
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
``
其中BinTree结构定义如下:
```c
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
int main()
{
BinTree BT = CreatBinTree();
printf("Inorder:"); InorderTraversal(BT); printf("\n");
printf("Preorder:"); PreorderTraversal(BT); printf("\n");
printf("Postorder:"); PostorderTraversal(BT); printf("\n");
printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输出样例(对于图中给出的树):
Inorder: D B E F A G H C I
Preorder: A B D F E C G H I
Postorder: D E F B H G I C A
Levelorder: A B C D F G I E H
void InorderTraversal( BinTree BT ){
if(BT){
//printf(" ");
InorderTraversal(BT->Left);
printf(" %c", BT->Data);
InorderTraversal(BT->Right);
}
}
void PreorderTraversal( BinTree BT ){
if(BT){
//printf(" ");
printf(" %c", BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
}
void PostorderTraversal( BinTree BT ){
if(BT){
//printf(" ");
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
printf(" %c", BT->Data);
}
}
void LevelorderTraversal( BinTree BT ){
//模拟队列
BinTree T, B[100];
int front=0, rear=0;
if(BT){
B[rear++] = BT;
while(front!=rear){
T = B[front++];
printf(" %c", T->Data);
if(T->Left) B[rear++] = T->Left;
if(T->Right) B[rear++] = T->Right;
}
}
}
因为不能再定义队列,所以用数组的方式模拟