数据结构(算法)-树

#include <iostream>
#include <malloc.h>

using namespace std;


#define MaxSize 100
typedef char ElemType;

typedef struct node{
	ElemType data;
	struct node *left ,*right;
} BTree;

//先序
void preorder(BTree * bt){
	if(bt != NULL){
		printf("%c",bt->data);
		preorder(bt->left);
		preorder(bt->right);

	}
}

//中序
void inoder(BTree * bt){
	if(bt != NULL){
		inoder(bt->left);
		printf("%c",bt->data);
		inoder(bt->right);
	}
}

//后序

void postorder(BTree *bt){
	if(bt != NULL){
		postorder(bt->left);
		postorder(bt->right);
		printf("%c",bt->data);
	}
}


void createTree(BTree **bt, char * str){
	BTree * stack[MaxSize] ,*p;
	int top=-1 , k, j=0;

	char ch;
	*bt =NULL;
	ch=str[j];
	while(ch !='\0'){
		switch(ch){
			case '(' :
				top++;
				stack[top]=p;
				k=1;
				break;
			case ')' :
				top--;
				break;
			case ',' :
				k=2;
				break;
			default:
				p=(BTree *)malloc(sizeof(BTree));
				p->data=ch;
				p->left=p->right=NULL;
				if(*bt ==NULL){
					*bt =p;
				}else{
					switch(k){
						case 1:
							stack[top]->left=p;
							break;
						case 2:
							stack[top]->right=p;
							break;
					}
				}
		}
		j++;
		ch=str[j];
	}
} 

//树的高度
int BTreeDepth(BTree * bt){
	int leftdep ,rightdep;
	if(bt ==NULL){
		return 0;
	}else {
		leftdep=BTreeDepth(bt->left);
		rightdep=BTreeDepth(bt->right);
		if(leftdep > rightdep){
			return leftdep +1;
		}else {
			return rightdep +1;
		}
	}
}

//树的叶子结点

int leafCout(BTree * bt){
	if(bt == NULL){
		return 0;
	}else if (bt ->left == NULL && bt ->right ==NULL){
		return 1;
	}else{
		return leafCout(bt->left) + leafCout(bt ->right) +1 ;
	}
}

void main(){
	BTree *b;
	char *s ="A(B(D,E(H,I)),C(G))";
	createTree(&b,s);
	printf("\n 先序遍历:");
	preorder(b);

	printf("\n 中序遍历:");
	inoder(b);
	
	printf("\n 后序遍历:");
	postorder(b);

	printf("\n树的高度:%d\n",BTreeDepth(b));

	printf("树的叶子结点:%d\n",leafCout(b));
	
}



 

测试结果


先序遍历:ABDEHICG
中序遍历:DBHEIAGC
后序遍历:DHIEBGCA
树的高度:4
树的叶子结点:8

 

转载于:https://my.oschina.net/saulc/blog/2250703

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值