binary tree

//BTree_Ergodic:main.cpp	二叉树遍历算法练习
//time:		2014.12.01 19:10
//author:	chaolee

/*********************************************************************************/
//头文件包含处
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*********************************************************************************/
//自定义数据类型声明处

//定义节点最大个数
#define MaxNode 20

//节点数据类型
typedef char ElemType;

//二叉树节点类型
typedef struct btnode{
	ElemType data;
	btnode * lchild;
	btnode * rchild;
}BtNode;

//二叉树栈
typedef struct{
	BtNode * stack[MaxNode];	//栈区
	int top;					//栈顶指针
}BTreeStack;


/*********************************************************************************/
//自定义函数声明处

//从括号表述法创建二叉树(使用栈进行实现)
bool CreateBTreefromBracketNotation(BtNode * &r,char * btStr){
	BTreeStack bts;
	bts.top=-1;						//初始化栈

	int i=0,k=0;					//i用于保存串的偏移量,k用于标记处理栈顶的左指针还是右指针
	char ch;						//ch用于保存括号表示法串的字符
	BtNode * temp=NULL;				//temp用于保存待处理的节点
	while((ch=*(btStr+i))!='\0')	//循环扫描串,并将字符存到ch
	{
		switch(ch){
		case '(':					//将子树根节点进栈,准备处理根节点左指针
			bts.stack[++bts.top]=temp;
			k=1;
			break;
		case ')':					//子树根节点出栈
			bts.top--;
			break;
		case ',':					//准备处理子树根节点右指针
			k=2;
			break;
		default:					//处理数据节点
			temp=(BtNode *)malloc(sizeof(BtNode));
			temp->data=ch;
			temp->lchild=temp->rchild=NULL;
			switch(k){
			case 0:
				r=temp;
				break;
			case 1:
				bts.stack[bts.top]->lchild=temp;
				break;
			case 2:
				bts.stack[bts.top]->rchild=temp;
				break;
			}
			break;
		}
		i++;
	}
	return true;
}

//根据括号表示法计算子树的长度
int FindLenofSon(char * s,int Len){
	char ch;			//ch用于保存单位串
	int i=0,match=0;	//i用于记录偏移长度,match用于保存状态
	if(*(s+1)==')'||*(s+1)==',')
		return 1;
	
	for(i=1;i<Len;i++){
		ch=*(s+i);
		if(ch=='(')
			match++;
		else if(ch==')'){
			match--;
			if(match==0)
				break;
		}
	}
	return i+1;
}

//从括号表述法创建二叉树(递归实现)
void CreateBTreefromBracketNotation2(BtNode * &r,char * btStr, int len){
	if(len<=0)
		return;
	r=(BtNode *)malloc(sizeof(BtNode));
	r->data=*btStr;
	
	int offset1=FindLenofSon(btStr+2,len-2);

	CreateBTreefromBracketNotation2(r->lchild,btStr+2,offset1);

	if(len-3-offset1<=0)
		return;
	else{
		int offset2=FindLenofSon(btStr+offset1,len-2-offset1);

		CreateBTreefromBracketNotation2(r->rchild,btStr+2+offset1,offset2);
	}

}

/*********************************************************************************/
//主函数
int main()
{
	char * BracketNotationStr="a(b(d,e))";

	BtNode * root=NULL,* root2=NULL;

	CreateBTreefromBracketNotation(root,BracketNotationStr);

	CreateBTreefromBracketNotation2(root2,BracketNotationStr,strlen(BracketNotationStr));

	system("PAUSE");
	return 0;
}


/************************************/
//说明:
//在本例中括号表示法如果右子树不存在则不需要打逗号
/************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值