您的位置:首页 > 其它

binary tree

2014-12-01 20:52 309 查看
//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;
}

/************************************/
//说明:
//在本例中括号表示法如果右子树不存在则不需要打逗号
/************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: