实验五 树

实验题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; 
}

仅作留档。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值