国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

二叉樹基本操作

2019-11-08 02:24:11
字體:
來源:轉載
供稿:網友
#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct node{	ElemType data;				//數據元素	struct node *lchild;		//指向左孩子	struct node *rchild;		//指向右孩子} BTNode;void CreateBTNode(BTNode *&b,char *str)		//由str串創建二叉鏈{	BTNode *St[MaxSize],*p=NULL;	int top=-1,k,j=0;	char ch;	b=NULL;				//建立的二叉樹初始時為空	ch=str[j];	while (ch!='/0')	//str未掃描完時循環	{   	   	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)                    //p指向二叉樹的根節點						b=p;					else  							//已建立二叉樹根節點					{						switch(k)						{						case 1:St[top]->lchild=p;break;						case 2:St[top]->rchild=p;break;						}					}		}		j++;		ch=str[j];	}}BTNode *FindNode(BTNode *b,ElemType x)	//返回data域為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)	//返回*p節點的左孩子節點指針{    return p->lchild;}BTNode *RchildNode(BTNode *p)	//返回*p節點的右孩子節點指針{    return p->rchild;}int BTNodeDepth(BTNode *b)	//求二叉樹b的深度{   	int lchilddep,rchilddep;   	if (b==NULL)		return(0); 							//空樹的高度為0   	else	{		lchilddep=BTNodeDepth(b->lchild);	//求左子樹的高度為lchilddep	  	rchilddep=BTNodeDepth(b->rchild);	//求右子樹的高度為rchilddep		return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);   	}}void DispBTNode(BTNode *b)	//以括號表示法輸出二叉樹{	if (b!=NULL)	{		PRintf("%c",b->data);		if (b->lchild!=NULL || b->rchild!=NULL)		{			printf("(");			DispBTNode(b->lchild);			if (b->rchild!=NULL) printf(",");			DispBTNode(b->rchild);			printf(")");		}	}}int BTWidth(BTNode *b)  //求二叉樹b的寬度{	struct	{		int lno;		//節點的層次編號		BTNode *p;		//節點指針	} Qu[MaxSize];		//定義順序非循環隊列	int front,rear;							//定義隊首和隊尾指針	int lnum,max,i,n;	front=rear=0;							//置隊列為空隊    if (b!=NULL)	{		rear++;		Qu[rear].p=b;						//根節點指針入隊		Qu[rear].lno=1;						//根節點的層次編號為1		while (rear!=front)					//隊列不為空		{			front++;			b=Qu[front].p;					//隊頭出隊			lnum=Qu[front].lno;			if (b->lchild!=NULL)			//左孩子入隊			{				rear++;				Qu[rear].p=b->lchild;				Qu[rear].lno=lnum+1;			}			if (b->rchild!=NULL)			//右孩子入隊			{				rear++;				Qu[rear].p=b->rchild;				Qu[rear].lno=lnum+1;			}		}		max=0;lnum=1;i=1;		while (i<=rear)		{			n=0;			while (i<=rear && Qu[i].lno==lnum)			{				n++;i++;			}			lnum=Qu[i].lno;			if (n>max) max=n;		}		return max;	}	else		return 0;}int Nodes(BTNode *b)	//求二叉樹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)	//求二叉樹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);	}}void DestroyBTNode(BTNode *&b){	if (b!=NULL)	{		DestroyBTNode(b->lchild);		DestroyBTNode(b->rchild);		free(b);	}}int main(){	BTNode *b,*p,*lp,*rp;;	CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");	printf("二叉樹的基本運算如下:/n");	printf("  (1)輸出二叉樹:");DispBTNode(b);printf("/n");	printf("  (2)H節點:");	p=FindNode(b,'H');	if (p!=NULL)	{	lp=LchildNode(p);		if (lp!=NULL)			printf("左孩子為%c ",lp->data);		else			printf("無左孩子 ");		rp=RchildNode(p);		if (rp!=NULL)			printf("右孩子為%c",rp->data);		else			printf("無右孩子 ");	}	printf("/n");	printf("  (3)二叉樹b的深度:%d/n",BTNodeDepth(b));	printf("  (4)二叉樹b的寬度:%d/n",BTWidth(b));	printf("  (5)二叉樹b的節點個數:%d/n",Nodes(b));	printf("  (6)二叉樹b的葉子節點個數:%d/n",LeafNodes(b));	printf("  (7)釋放二叉樹b/n");	DestroyBTNode(b);	return 0;}

運行結果:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麦盖提县| 准格尔旗| 安多县| 屏边| 松江区| 台东市| 肥乡县| 那曲县| 绍兴市| 金溪县| 垫江县| 乐都县| 永德县| 商都县| 措美县| 中方县| 上饶县| 塔城市| 东方市| 福清市| 平昌县| 安达市| 互助| 三穗县| 林口县| 太康县| 中卫市| 玉溪市| 绵竹市| 恩平市| 定结县| 黄梅县| 仙桃市| 永和县| 新绛县| 开远市| 前郭尔| 隆尧县| 承德县| 莒南县| 凭祥市|