實驗七 二叉樹操作(二)
一、 實驗目的
1. 掌握二叉樹的建立
2. 掌握二叉樹的遍曆
3. 掌握二叉樹的應用
二、 實驗內容。
1.前序地建立二叉樹ABC##DE#G##F###,實現複製建構函式、、返回樹的高、返回結點數、層序遍曆二叉樹。
2.設計測試步驟,測試以上每個函數。
3.提高部分:遍曆硬碟中某個檔案夾。
三、 實驗環境
1.pc機,windowsxp作業系統
2.VC++6.0軟體
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespacestd;
#define SIZE 50
int leafcount=0;
typedef structBiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
BiTNode *base;
int front;
int rear;
int length;
}Queue,*PQueue;
voidinit_Q(Queue &Q);
void En_Q(Queue&Q,BiTree T);
void De_Q(Queue&Q,BiTree &T);
voidLevelOrderTraverse(BiTree T){//層序遍曆
Queue Q;
init_Q(Q);
if(T){
En_Q(Q,T);
}
while(Q.front!=Q.rear){
BiTree temp;
De_Q(Q,temp);
putchar(temp->data);
if(temp->lchild) En_Q(Q,temp->lchild);
if(temp->rchild) En_Q(Q,temp->rchild);
}
}
voidinit_Q(Queue &Q){
Q.base=new BiTNode[SIZE];
Q.front=Q.rear=0;
Q.length=0;
}
void En_Q(Queue&Q,BiTree T){
if(Q.length==SIZE){
printf("FULL!\n");
return;
}
Q.base[Q.rear]=*T;
Q.rear=(Q.rear+1)%SIZE;
Q.length++;
}
void De_Q(Queue&Q,BiTree &T){
if(Q.length==0){
printf("EMPTY!\n");
return;
}
T=&(Q.base[Q.front]);
Q.front=(Q.front+1)%SIZE;
Q.length--;
}
intCreateBiTree(BiTree *T)/*根據先序序列建立二叉樹的二叉鏈表*/
{ char ch;
scanf("%c",&ch);
if(ch=='#')
{
*T=NULL;
}
else{
if(!(*T=(BiTree)malloc(sizeof(BiTNode)))) return 0;
(*T)->data=ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
return 1;
}
intpreOrder(BiTree T)/*先序遍曆的遞迴演算法*/
{
if(T){
printf("%c ",T->data);
if (!T->lchild&&!T->rchild)leafcount+=1;
preOrder(T->lchild);
preOrder(T->rchild);
}
return 1;
}
intinOrder(BiTree T)/*中序遍曆的遞迴演算法*/
{
if(T){
inOrder(T->lchild);
printf("%c ",T->data);
inOrder(T->rchild);
}
return 1;
}
intoldOrder(BiTree T)/*後序遍曆的遞迴演算法*/
{
if(T){
oldOrder(T->lchild);
oldOrder(T->rchild);
printf("%c ",T->data);
}
return 1;
}
int Size(BiTreeT){
//輸出節點數
if(T==NULL)
return 0;
else return1+Size(T->lchild)+Size(T->rchild);
}
int Hight(BiTreeT)
{
if(T==NULL)return 0;
else{
int i=Hight(T->lchild);
int j=Hight(T->rchild);
return (i>j)?i+1:j+1;
}
}
void main()
{ BiTree T;
leafcount=0;
int n;
printf("請讀入字元abc--de-g--f---\n");
CreateBiTree(&T);
printf("先序遍曆序列為:");
preOrder(T);
printf("\n中序遍曆序列為:");
inOrder(T);
printf("\n後序遍曆序列為:");
oldOrder(T);
printf("\n
層序遍曆:");
LevelOrderTraverse(T);
printf("\n葉子節點:%d\n",leafcount);
printf("所有結點個數");
n=Size(T);
printf("%d",n);
cout<<"\nhigh="<<Hight(T)<<endl;
//system("pause");
}