|
常用链接
留言簿(4)
随笔分类
随笔档案
搜索
最新评论

阅读排行榜
评论排行榜
Powered by: 博客园
模板提供:沪江博客
|
|
|
|
|
发新文章 |
|
|
帮同学妹妹弄的作业。。。 以后可以参考
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <iomanip>
#include <stdlib.h>
#include <algorithm>
using namespace std;

#define HeadSTUDENT int


//以下是数据类型的定义

 enum Status {OK, ERROR};

typedef struct
  {
char number[10];
char name[8];
char sex[3];
int age;
char place[20];
}STUDENT;
typedef struct BinaryTreeNode
  {
STUDENT data;
BinaryTreeNode *LChild;
BinaryTreeNode *RChild;
} BinaryTree;


typedef struct
  {
BinaryTreeNode *ptr;
bool B; //true代表左子树,false代表右子树
} SType;


typedef struct //StackElement
  {
SType *element;
int top;
int MaxSize;
} Stack;

void DigitalToString(char str[],int n)
  {
char temp;
char k=1;
int i=0;
while (n && i<80)
 {
k=n%10+48;
n=n/10;
str[i]=k;
i++;
}
str[i]='\0';

int len=strlen(str);
for (i=0;i<len/2;i++)
 {
temp=str[i];
str[i]=str[len-i-1];
str[len-i-1]=temp;
}
}


void OutputLevelOrderTL(BinaryTreeNode *BT)
  {// 从左至右,从上至下按层次输出一棵二叉树
typedef struct
 {
BinaryTreeNode *ptr;
} Node_Ptr;

Node_Ptr temp,*element;
BinaryTreeNode *p;
int MaxSize=50;
int pagewidth=80;
int node_last_position;
int High;

element = new Node_Ptr [MaxSize+1]; //定义一个用于存放二叉树结点指针的数组

for (int i=1;i<MaxSize;i++) //对指针数组初始化,初值设为NULL
element[i].ptr=NULL;
p = BT;
temp.ptr = p;
if (p) element[1]=temp;
for (int i=1;i<MaxSize/2;i++) //将二叉树中的每个结点指针以顺序存储结构存放到数组中,并同时求取最大结点的编号
 {
p=element[i].ptr;
if (p)
 {
if (p->LChild)
 {
temp.ptr = p->LChild;
element[2*i]=temp;

node_last_position=2*i;
}
if (p->RChild)
 {
temp.ptr = p->RChild;
element[2*i+1]=temp;
node_last_position=2*i+1;
}
}
}

cout<<endl;
 int position_data[32]= {0,
40,
20, 40,
10, 20, 20, 20,
6, 10, 10, 10, 10, 10, 10, 10,
3,5,5,5, 5,5,5,5, 5,5, 5,5, 5,5, 5,5};
int kk,k;
int startnum,endnum;
int startnum1,endnum1;
int len, curlenharf,prelenharf,templen,lenharf;
int num_space;
char str[80];
 char emptystr[42]= {""};
char space[2]=" ";
char line[3]="─";
char prechar[42]; //prechar中记载当前输入出项的字符串
char prespace[42]; //prespace中记载当前输入出项前面的空格串
char postspace[42]; //postspace中记载当前输入出项后面的空格串

cout<<" "<<"根结点BT"<<endl;
cout<<" "<<" ↘"<<endl;

High=log((double)node_last_position)/log(2.0)+1;
startnum=1; //startnum中记载当前层中起始结点编号
startnum1=2; //startnum中记载当前层中起始结点编号
for (int i=1;i<=High;i++)
 {
endnum=pow(2.0,i)-1; //endnum中记载当前层中最大结点编号
if (endnum>node_last_position)
endnum=node_last_position;
prelenharf=0;
//输出第一个数据项
for(k=startnum;k<=endnum;k++)
 {
templen=1;
p=element[k].ptr;
if (p)
 {
DigitalToString(str, p->data.age);
len=strlen(str);
curlenharf=len/2;
if (!(len%2) && (prelenharf%2)==(curlenharf%2)&&(k%2))
templen-=2;
if ((prelenharf%2)!=(curlenharf%2)&&(k%2))
templen--;
num_space=position_data[k]-curlenharf-prelenharf-templen;
}
else
num_space=position_data[k]-templen-2;
strcpy(prechar,emptystr); //前导空格串的初值为空串
for (kk=1;kk<=num_space;kk++) //用字符串联接方式生成前导空格串prechar
strcat(prechar,space);
prelenharf=curlenharf;
if (p)
cout<<prechar<<p->data.age;
else
cout<<prechar<<" "; //" 0 "
}
cout<<endl;
//输出第二个数据项
prelenharf=0;
for(k=startnum;k<=endnum;k++)
 {
templen=1;
p=element[k].ptr;
if (p)
 {
len=strlen(p->data.name);
curlenharf=len/2;
if (!(len%2) && (prelenharf%2)==(curlenharf%2)&&(k%2))
templen-=2;
if ((prelenharf%2)!=(curlenharf%2)&&(k%2))
templen--;
num_space=position_data[k]-curlenharf-prelenharf-templen;
}
else
num_space=position_data[k]-templen-2;

strcpy(prechar,emptystr); //前导空格串的初值为空串
for (kk=1;kk<=num_space;kk++) //用字符串联接方式生成前导空格串prechar
strcat(prechar,space);
prelenharf=curlenharf;
if (p)
cout<<prechar<<p->data.name ;
else
cout<<prechar<<" "; //" ^ "
}
startnum=endnum+1;
cout<<endl;

//以下程序是完成分支结的输出
 int position_line[32]= {0,
20,
19, 19,
9, 9, 18, 9,
5, 3, 10, 3, 10, 3, 10, 3,
2,1, 4,1,4,1, 4,1, 4, 1,4,1, 4,1,4,1};
if (i<High)
 {
endnum1=pow(2.0,i+1)-1; //endnum中记载第i层下面的分枝线层中最大结点编号
for(k=startnum1;k<=endnum1;k++)
 {
strcpy(prechar,emptystr); //前导空格串的初值为空串
for (kk=1;kk<=position_line[k];kk++) //用字符串联接方式生成前导空格串prechar==startnum1
if (!(k%2))
strcat(prechar,space); //形成当前中第偶数个结点前的空格串
else
strcat(prechar,line); //形成当前中第奇数个结点前的"─"串

if (!(k%2))
cout<<prechar; //当前中第偶数个结点前输出空格串
else
 {
len=strlen(prechar);
lenharf=len/2;
if ((element[k-1].ptr && element[k].ptr)) //当前分支左右均有结点
 {
prechar[lenharf]='┴';
cout<<"┌"<<prechar<<"┐";
}
if ((element[k-1].ptr && !element[k].ptr)) //当前分支左边有结点,右边无结点
 {
prechar[lenharf-1]='\0';
cout<<"┌"<<prechar<<"┘";
strcpy(postspace,emptystr);
for (kk=1;kk<=lenharf+1;kk++)
strcat(postspace,space);
cout<<postspace;
}
if ((!element[k-1].ptr && element[k].ptr)) //当前分支右边有结点,左边无结点
 {
strcpy(prespace,emptystr);
for (kk=1;kk<=lenharf+1;kk++)
strcat(prespace,space);
prechar[lenharf-1]='\0';
cout<<prespace<<"└"<<prechar<<"┐";
}
if ((!element[k-1].ptr && !element[k].ptr)) //当前分支左右均无结点
 {
strcpy(prespace,emptystr);
for (kk=1;kk<=len;kk++)
strcat(prespace,space);
cout<<prespace<<" ";
}
}
}
cout<<endl;
startnum1=endnum1+1;
}
}
cout<<endl<<endl<<endl;
}


void CreatStack(Stack &S, int MaxStackSize)
  {// 构造一个最大容量为MaxStackSize 的堆栈
S.MaxSize = MaxStackSize;
S.element = new SType[S.MaxSize];
S.top =-1;
}

bool IsEmpty(Stack &S)
  {// 判断堆栈S是否为空
if (S.top == -1) return true;
return false;
}

bool IsFull(Stack &S)
  {// 判断堆栈S是否为满
if (S.top >= S.MaxSize-1) return true;
return false;
}
Status Push(Stack &S , SType &x)
  {// x进s栈,返回进栈后的状态值
if (IsFull(S)) return ERROR;
S.top++;
S.element[S.top] = x;
return OK;
}

Status Pop(Stack &S , SType &x)
  {// 将s栈顶的值取至x中,返回出栈后的状态值
if (IsEmpty(S)) return ERROR;
x = S.element[S.top];
S.top--;
return OK;
}

BinaryTreeNode *MakeNode(STUDENT &x)
  {//构造结点
BinaryTreeNode* newtree=new BinaryTreeNode;
newtree->data=x;
return newtree;
}

void MakeBinaryTree(BinaryTreeNode *root, BinaryTreeNode *left, BinaryTreeNode *right)
  {// 联接root,left, right所指的结点指针为二叉树
root->LChild=left;
root->RChild=right;
}

int BinaryHeight(BinaryTreeNode *BT)
  {// 返回二叉树的高度
if (BT==NULL) return 0;
int HighL = BinaryHeight(BT ->LChild);
int HighR = BinaryHeight(BT ->RChild);
if (HighL > HighR)
return ++HighL;
else
return ++HighR;
}

void PreOrderN(BinaryTreeNode *BT)
  {//二叉树的前序遍历非递归算法
Stack S;
SType temp;
BinaryTreeNode *p = BT;
int MaxStackSize=50;
CreatStack(S ,MaxStackSize); //产生一个空栈,这一过程函数可以不在这里进行
while (p!=NULL || !IsEmpty(S))
 {
while (p!=NULL) //遍历左子树
 {
temp.ptr=p;
Push(S,temp);
cout<<p->data.name<<" ";
p=p->LChild;
}

if (!IsEmpty(S)) //通过下一次循环中的内嵌while实现右子树遍历
 {
Pop(S,temp);
p=temp.ptr->RChild;
}

}
cout<<endl;
}

void InOrderN(BinaryTreeNode *BT)
  {//二叉树的中序遍历非递归算法
Stack S;
SType temp;
BinaryTreeNode *p = BT;
int MaxStackSize=50;
CreatStack (S , MaxStackSize); //产生一个空栈,这一过程函数可以不在这里进行
while (p!=NULL || !IsEmpty(S))
 {
while (p!=NULL) //遍历左子树
 {
temp.ptr=p;
Push(S,temp);
p=p->LChild;
}

if (!IsEmpty(S))
 {
Pop(S,temp);
cout<<temp.ptr->data.name<<" ";
p=temp.ptr->RChild;; //通过下一次循环实现右子树遍历
}

}
cout<<endl;
}


void PostOrderN(BinaryTreeNode *BT)
  {//二叉树的后序遍历非递归算法
SType temp;
Stack S;
BinaryTreeNode *p = BT;
int MaxStackSize=50;
CreatStack (S , MaxStackSize); //产生一个空栈,这一过程函数可以不在这里进行
do
 {
while (p!=NULL) //遍历左子树
 {
temp.ptr = p;
temp.B = false; //标记为左子树
Push(S,temp);
p=p->LChild;
}

while (!IsEmpty(S) && S.element[S.top].B==true)
 {
Pop(S,temp);
p = temp.ptr;
cout<<temp.ptr->data.name<<" "; //tag为R,表示右子树访问完毕,故访问根结点
}

if (!IsEmpty(S))
 {
S.element[S.top].B =true; //遍历右子树
p=S.element[S.top].ptr->RChild;
}
}while (!IsEmpty(S));

cout<<endl;
}



//下面是主程序
int main()
  {
BinaryTreeNode *BT,*p=NULL,*pp[10];
STUDENT x;
int High;


 char n[][8]= {" ","AAA","BBB","CCC","DDD","EEE","FFF","GGG","HHH"};

for(int i=1;i<9;i++)
 {
strcpy(x.number,"7777777");
strcpy(x.name,n[i]);
if (i>4)
strcpy(x.sex,"男");
else
strcpy(x.sex,"女");
x.age=500+i;
strcpy(x.place,"WWWWW");
pp[i]=MakeNode(x);
p=pp[i];
}

MakeBinaryTree(pp[1], pp[2], pp[3]);
MakeBinaryTree(pp[2], pp[4], NULL);
MakeBinaryTree(pp[3], pp[5], pp[6]);
MakeBinaryTree(pp[4], NULL, pp[7]);
MakeBinaryTree(pp[5], pp[8], NULL);
BT=pp[1];
pp[7]->LChild=NULL;
pp[7]->RChild=NULL;
pp[8]->LChild=NULL;
pp[8]->RChild=NULL;
pp[6]->LChild=NULL;
pp[6]->RChild=NULL;
High=BinaryHeight(BT) ;
cout<<"树高="<<High<<endl<<endl;
OutputLevelOrderTL(BT);
cout<<"先序遍历的顺序为:"<<endl;
PreOrderN(BT);
cout<<"中序遍历的顺序为:"<<endl;
InOrderN(BT);
cout<<"后序遍历的顺序为:"<<endl;
PostOrderN(BT);
return 0;
}


|
|