main.cpp
#include<bits/stdc++.h>
#include"erchashu.h"
using namespace std;
int main()
{
char str[100];
gets(str);
btnode *b,*s;
creatbtnode(b,str);
display(b);
cout<<endl;
s=findnode(b,'H');
if(s!=NULL)
cout<<s->lchild->data<<' '<<s->rchild->data<<endl;
else
cout<<"未找到值为H的节点"<<endl;
cout<<btnodegao(b)<<endl;
xiaohui(b);
return 0;
}
erchashu.h
#ifndef ERCHASHU_H_INCLUDED
#define ERCHASHU_H_INCLUDED
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}btnode;
void creatbtnode(btnode *&b,char *str);
btnode *findnode(btnode *b,char x);
btnode *lchildnode(btnode *p);
btnode *rchildnode(btnode *p);
int btnodegao(btnode *b);
void display(btnode *b);
void xiaohui(btnode *&b);
#endif // ERCHASHU_H_INCLUDED
erchashu.cpp
#include<bits/stdc++.h>
#include"erchashu.h"
using namespace std;
void creatbtnode(btnode *&b,char *str)///建立二叉树
{
btnode *st[100],*p;///用数组去模拟栈结构
int top=-1,k,j=0;///这里的top就可以看成是指向栈中元素的指针
char ch;
b=NULL;///b初始指向一个空树
ch=str[j];///初始化为str[0]
while(ch!='\0')
{
switch(ch)
{
case'(':///将左括号前的树节点入栈
top++;
st[top]=p;
k=1;
break;
case')':///代表当前节点处理完毕,向上回溯
top--;
break;
case',':///k=2代表了将要处理节点的右子数了,并且这个节点是有右子数的
k=2;
break;
default:///每遇到一个非符号输入就为它开辟一个新的树节点空间来存储它的数据
p=(btnode *)malloc(sizeof(node));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
b=p;
else
{
switch(k)
{
case 1:
st[top]->lchild=p;
break;
case 2:
st[top]->rchild=p;
break;
}
}
}
j++;
ch=str[j];
}
}
btnode *findnode(btnode *b,char x)
{
btnode *p;
if(b==NULL)
return NULL;
else if(b->data==x)
return b;
else
{
p=findnode(b->lchild,x);
if(p!=NULL)
return p;
else
return findnode(b->rchild,x);
}
}
btnode *lchildnode(btnode *p)///OK
{
return p->lchild;
}
btnode *rchildnode(btnode *p)
{
return p->rchild;
}
int btnodegao(btnode *b)///这些函数都是用递归思想去解决问题的,同时也很好的体现了递归思想
{
int lchildg,rchildg;
if(b==NULL)
return 0;
else
{
lchildg=btnodegao(b->lchild);
rchildg=btnodegao(b->rchild);
return (lchildg>rchildg)?(lchildg+1):(rchildg+1);
}
}
void display(btnode *b)
{
if(b!=NULL)
{
cout<<b->data;
if(b->lchild!=NULL||b->rchild!=NULL)
{
cout<<'(';
display(b->lchild);
if(b->rchild!=NULL)
cout<<',';
display(b->rchild);
cout<<')';
}
}
//cout<<endl;
}
void xiaohui(btnode *&b)
{
if(b!=NULL)
{
xiaohui(b->lchild);
xiaohui(b->rchild);
free(b);
}
}
运行结果:
我这个并不是无脑抄袭课本,起码我认真思考了;思考了书上程序的优点和值得我们学习的地方;更深刻地理解了递归思想!这也是学习的一个必经之路呀。