实验题1:编写一个程序,实现二叉树的基本运算,并在此基础上设计一个程序完成如下功能。
(1)由图所示的二叉树创建对应的二叉链存储结构b,该二叉树的括号表示串为“A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”。
(2)输出二叉树b。
(3)输出‘H’结点的左右孩子的结点值。
(4)输出二叉树b的高度。
(5)释放二叉树b。
#include <iostream>
#include "stdio.h"
#include "malloc.h"
using namespace std;
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
}BTNode;
void CreateBTree(BTNode *&b,char *str)//创建二叉树
{
BTNode *St[100];
BTNode *p;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':top++;St[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:
p=(BTNode*)malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
{
b=p;
}
else
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
void DestroyBTree(BTNode*&b)//销毁二叉树
{
if(b!=NULL)
{
DestroyBTree(b->lchild);
DestroyBTree(b->rchild);
free(b);
}
}
BTNode *FindNode(BTNode *b,char x)//查找结点
{
BTNode *p;
if(b==NULL) return NULL;
else if(b->data==x) return b;
else
{
p=FindNode(b->lchild,x);
if(p!=NULL) return p;
else return FindNode(b->rchild,x);
}
}
BTNode *LchildNode(BTNode *p)//找左孩子结点
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)//找右孩子结点
{
return p->rchild;
}
int BTHeight(BTNode *b)//求高度
{
int lchildh,rchildh;
if(b==NULL) return(0);
else
{
lchildh=BTHeight(b->lchild);
rchildh=BTHeight(b->rchild);
return(lchildh>rchildh)?(lchildh+1):(rchildh+1);
}
}
void DispBTree(BTNode *b)//输出二叉树
{
if(b!=NULL)
{
cout<<b->data;
if(b->lchild!=NULL || b->rchild!=NULL)
{
cout<<"(";
DispBTree(b->lchild);
if(b->rchild!=NULL) cout<<",";
DispBTree(b->rchild);
cout<<")";
}
}
}
int main()
{
BTNode *test,*a,*b,*c;
CreateBTree(test,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
cout<<"输出二叉树:";
DispBTree(test);
cout<<endl;
cout<<"H结点的左右孩子的结点值:";
a=FindNode(test,'H');
b=LchildNode(a);
c=RchildNode(a);
cout<<b->data<<" "<<c->data<<endl;
cout<<"二叉树的高度:"<<BTHeight(test)<<endl;
DestroyBTree(test);
return 1;
}
实验题6:编写一个程序实现以下功能,并对图所示的二叉树进行验证。
(1)输出二叉树b的结点个数。
(2)输出二叉树b的叶子结点个数。
(3)求二叉树b中指定结点值(假设所有结点值不同)的结点的层次。
(4)利用层次遍历求二叉树b的宽度。
#include <iostream>
#include "stdio.h"
#include "malloc.h"
using namespace std;
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
}BTNode;
void CreateBTree(BTNode *&b,char *str)//创建二叉树
{
BTNode *St[100],*p;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':top++;St[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:
p=(BTNode*)malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
{
b=p;
}
else
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
void DestroyBTree(BTNode*&b)//销毁二叉树
{
if(b!=NULL)
{
DestroyBTree(b->lchild);
DestroyBTree(b->rchild);
free(b);
}
}
BTNode *FindNode(BTNode *b,char x)//查找结点
{
BTNode *p;
if(b==NULL) return NULL;
else if(b->data==x) return b;
else
{
p=FindNode(b->lchild,x);
if(p!=NULL) return p;
else return FindNode(b->rchild,x);
}
}
BTNode *LchildNode(BTNode *p)//找左孩子结点
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)//找右孩子结点
{
return p->rchild;
}
int BTHeight(BTNode *b)//求高度
{
int lchildh,rchildh;
if(b==NULL) return(0);
else
{
lchildh=BTHeight(b->lchild);
rchildh=BTHeight(b->rchild);
return(lchildh>rchildh)?(lchildh+1):(rchildh+1);
}
}
void DispBTree(BTNode *b)//输出二叉树
{
if(b!=NULL)
{
cout<<b->data;
if(b->lchild!=NULL || b->rchild!=NULL)
{
cout<<"(";
DispBTree(b->lchild);
if(b->rchild!=NULL) cout<<",";
DispBTree(b->rchild);
cout<<")";
}
}
}
int Nodes(BTNode *b)
{
int num1,num2;
if(b==NULL) return 0;
else if(b->lchild==NULL&&b->rchild==NULL) return 1;
else
{
num1=Nodes(b->lchild);
num2=Nodes(b->rchild);
return(num1+num2+1);
}
}
int LeafNodes(BTNode *b)
{
int num1,num2;
if(b==NULL) return 0;
else if(b->lchild==NULL&&b->rchild==NULL) return 1;
else
{
num1=LeafNodes(b->lchild);
num2=LeafNodes(b->rchild);
return(num1+num2);
}
}
int Level(BTNode *b,ElemType x,int h)
{
int l;
if(b==NULL) return 0;
else if(b->data==x) return h;
else
{
l=Level(b->lchild,x,h+1);
if(l!=0) return l;
else return(Level(b->rchild,x,h+1));
}
}
int main()
{
ElemType x='K';
BTNode *b,*p,*lp,*rp;
CreateBTree(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
cout<<"输出二叉树:";DispBTree(b);cout<<endl;
cout<<"二叉树的结点个数:"<<Nodes(b)<<endl;
cout<<"二叉树的叶子结点个数:"<<LeafNodes(b)<<endl;
cout<<"二叉树中值为"<<x<<"的层次:"<<Level(b,x,1)<<endl;
DestroyBTree(b);
return 1;
}
仅作留档。