树和二叉树的一些操作的C/C++源码

2 篇文章 0 订阅
1 篇文章 0 订阅

“tree.h”

typedef char ElemType ;
#define kk 3
typedef struct BTreeNode{
ElemType data;
struct BTreeNode *left;
struct BTreeNode *right;
} BT;


typedef struct TreeNode{
ElemType data;
struct TreeNode *t[kk];
} T;


"tree.cpp"

/*二叉树的操作*/

void InitBTree(BT **bt){
*bt=NULL;
}

//二叉树的创建,根据树的广义表表示法建立树(如a(b(c),d(e(f,g),h(,i))))
void Create(BT **bt,char *a){
BT *p;
stack<BT*,vector<BT*>> s;
int i=0,j,k;
*bt=NULL;
while(a[i]){
switch(a[i]){
case ' ':
break;
case '(':
s.push(p);k=1;
break;
case ')':
s.pop();
break;
case ',':
k=2;break;
default:
p=(BT*)malloc(sizeof(BT));
p->data=a[i];p->left=p->right=NULL;
if(*bt==NULL) *bt=p;
else{
if(k==1) s.top()->left=p;
else s.top()->right=p;
}
}
i++;
}


}

//检查树是否为空
int BTreeEmpty(BT *bt){
if(bt==NULL) return 1;
else return 0;
}

//求树的深度
int BTreeDepth(BT *bt){
if(bt==NULL) return 0;
else{
int left=BTreeDepth(bt->left);
int right=BTreeDepth(bt->right);
if(left>right) return left+1;
else return right+1;
}
}

//前序遍历
void Preorder(BT *bt){
if(bt!=NULL){
printf("%c",bt->data);
Preorder(bt->left);
Preorder(bt->right);
}
}

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

//后序遍历
void Postorder(BT *bt){
if(bt!=NULL){
Postorder(bt->left);
Postorder(bt->right);
printf("%c",bt->data);
}
}
//按层遍历
void Levelorder(BT *bt){
queue<BT*>q;
if(bt!=NULL)
q.push(bt);
BT *p=bt;
while(!q.empty()){
printf("%c",q.front()->data);
p=q.front();
q.pop();
if(p->left!=NULL)
q.push(p->left);
if(p->right!=NULL)
q.push(p->right);
}
}
//打印二叉树为广义表
void PrintBTree(BT *bt){
if(bt!=NULL){
printf("%c",bt->data);
if(bt->left!=NULL||bt->right!=NULL){
printf("(");
PrintBTree(bt->left);
if(bt->right!=NULL) printf(",");
PrintBTree(bt->right);
printf(")");
}
}
}
//查找值为X的二叉树中的指针位置
ElemType *FindBTree(BT *bt,ElemType x){
if(bt==NULL) return NULL;
if(bt->data==x) return &(bt->data);
else{
ElemType *p;
if(p=FindBTree(bt->left,x)) return p;
if(p=FindBTree(bt->right,x)) return p;
return NULL;
}
}


/*树的操作 kk为树的叉数*/

void InitTree(T **t){
*t=NULL;



void CreateTree(T **tt,char *a){
T *p=NULL;
*tt=NULL;
int i=0,k,j=0;
stack<T*,vector<T*>>s;
stack<int,vector<int>>pnum;
while(a[i]){
switch(a[i]){
case' ':break;
case'(':
s.push(p);
pnum.push(0);
break;
case')':
s.pop();
pnum.pop();
break;
case',':
pnum.top()++;
break;
default:
p=(T*)malloc(sizeof(T));
p->data=a[i];
for(j=0;j<kk;j++)
p->t[j]=NULL;
if(*tt==NULL) *tt=p;
else{
s.top()->t[pnum.top()]=p;
}


}
i++;
}
}


void PreRoot(T *tt){
if(tt!=NULL){
printf("%c ",tt->data);
for(int i=0;i<kk;i++)
PreRoot(tt->t[i]);
}
}
void PostRoot(T *tt){
if(tt!=NULL){
for(int i=0;i<kk;i++)
PostRoot(tt->t[i]);
printf("%c ",tt->data);
}
}
void Levelorder(T *tt){
queue<T*> q;
if(tt!=NULL)
q.push(tt);
T* p=NULL;
int i=0;
while(!q.empty()){
printf("%c ",q.front()->data);
p=q.front();
q.pop();
for(i=0;i<kk;i++){
if(p->t[i]!=NULL)
q.push(p->t[i]);
}
}
}


ElemType *FindTree(T *tt,ElemType x){
if(tt==NULL) return NULL;
if(x==tt->data) return &(tt->data);
else{
ElemType *p;
for(int i=0;i<kk;i++){
if(p=FindTree(tt->t[i],x));
return p;
}
return NULL;
}
}


int TreeDepth(T *tt){
int i,max=0,depth;
if(tt==NULL) return 0;
else{
for(i=0;i<kk;i++){
depth=TreeDepth(tt->t[i])+1;
if(depth>max)
max=depth;
}
return max;

}
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值