顺序树的基本操作

#include<stdio.h>
#include<stdlib.h> 
#define MaxSize 100
typedef struct BTree{
	char data[MaxSize];
	int n;
}BT;

void CreatBTree(BT &tree,char str1[],int i,int &s)
{
	char ch=str1[s++];
	if(ch==';')
	return ;
	if(ch!='#')
	{
		tree.data[i]=ch;
		CreatBTree(tree,str1,2*i+1,s);
		CreatBTree(tree,str1,2*i+2,s);
	} 
}

void printBTree(BT &tree,int i)
{
	if(tree.data[i]!=';')
	{
		if(tree.data[i]!='#')//是否输出无效数据‘#’ 
	printf("%c",tree.data[i]);
	if(tree.data[2*i+1]!='#'||tree.data[2*i+2]!='#')
	{
		printf("(");
		printBTree(tree,2*i+1);
		printf(",");
		printBTree(tree,2*i+2);
		printf(")");
	}
	}
}

void GetLeaf(BT &tree,int i,int &n)
{	


	if(tree.data[2*i+1]=='#'&&tree.data[2*i+2]=='#')
	{
		if(tree.data[i]!='#')
		{
		n++;
		printf("%c\t",tree.data[i]);
		}
		
	}
		
	
	else
	{
	GetLeaf(tree,2*i+1,n);
	GetLeaf(tree,2*i+2,n);
	}
 } 
  
void getParent(BT &tree,int i)
 {
 	if(tree.data[i]=='#')
 	printf("该节点为空!"); 
 	else{
	 
 	char ch;
 	ch=tree.data[(i-1)/2];
 	printf("%c的双亲结点是%c",tree.data[i],ch);
 }
}
void getChild(BT &tree,int i)
{
	char ch1,ch2;
	

	ch1=tree.data[2*i+1];
	ch2=tree.data[2*i+2];
	if(ch1=='#')
	{
		printf("该树没有左孩子\n");	 
	}
	else
	{
	printf("%c的左孩子是%c",tree.data[i],ch1); 
	}
	if(tree.data[2*i+2]=='#')
	{
		printf("该树没有右孩子\n");
	}
	else
	{
		printf("%c的右孩子是%c",tree.data[i],ch2); 
	}
	
}


void GetEffectiveElem(BT &tree)
{
	if(tree.data[0]=='\0')
	return ;
	printf("有效数据为:\n");
	for(int i=0;i<MaxSize;i++)
	{
	  
	if(tree.data[i]!='#')
	{
		printf("%c",tree.data[i]);
	}
	}
}
int main()
{
	char str1[]={'A','B','#','D','E','#','F','#','#','#','G','#','#',';'};
	int n=0,k=0;
	BT bt;
	for(int i=0;i<MaxSize;i++)
	bt.data[i]='#';
	CreatBTree(bt,str1,n,k);
	printBTree(bt,n); 
	printf("\n\n");
	getParent(bt,1);
	int i=0;
	printf("\n\n叶子结点:");
	int s=0;
	printf("\n\n");
	GetLeaf(bt,i,s);
	printf("\n\n");
	printf("叶子结点的数量为:%d",s);
	printf("\n\n");
	getChild(bt,4);
	printf("\n\n");
	GetEffectiveElem(bt);
	
	

	
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值