运行截图:
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef struct BTNode
{
int data;
BTNode *lchild;
BTNode *rchild;
}BTNode;
//建树
BTNode*CreateBTNode(char *str)
{
BTNode *r=NULL; //建立二叉树初始值为空
BTNode *st[maxsize];
BTNode *p;
int top=-1,k=0,j=0; //top栈顶指针,j遍历字符串,k标记左右孩子,1为左孩子
char ch; //输入的字符
while(str[j]!='\0')
{
ch=str[j];
switch(ch)
{
case'(':top++;st[top]=p;k=1;break;
case')':top--;break;
case ',':k=2;break;
default:
p=(BTNode*)malloc(sizeof(BTNode));
p->lchild=p->rchild=NULL;
p->data=ch;
if(r==NULL)
r=p; //p为根节点
else
{
switch(k)
{
case 1:st[top]->lchild=p;break;
case 2:st[top]->rchild=p;break;
default:break;
}
}
break;
}
j++; //循环遍历字符串str
}
return r;
}
//打印字符串 ,递归先序遍历
void DispBTNode1(BTNode *t)
{
if(t!=NULL)
{
printf("%c",t->data);
DispBTNode1(t->lchild);
DispBTNode1(t->rchild);
}
}
//查找节点
BTNode *FindNode(BTNode *b,int 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);
}
}
//计算叶子节点数目,所有节点数目
int LeafNodes(BTNode *b)
{
int num1,num2;
if(b==NULL)
return 0;
else if (b->lchild==NULL&&b->rchild==NULL)
return 1;
else
{
num1=LeafNodes(b->lchild);
num2=LeafNodes(b->rchild);
return (num1+num2);
//return (num1+num2+1) //返回所有节点
}
}
//查找左右孩子节点
BTNode *LchildNode(BTNode *t)
{
if(t->lchild!=NULL){
printf("左孩子节点:%c\n",t->lchild->data);
return t->lchild;
}else{
printf("该节点的左孩子为空\n");
}
}
BTNode *RchildNode(BTNode *t)
{
if(t->rchild!=NULL){
printf("右孩子节点:%c\n",t->rchild->data);
return t->rchild;
}else{
printf("该节点的右孩子为空\n");
}
}
//求树高度,深度
int BTNodeDepth(BTNode *t)
{
int lchildDepth,rchildDepth;
if(t==NULL)
return 0;
else
{
lchildDepth=BTNodeDepth(t->lchild);
rchildDepth=BTNodeDepth(t->rchild);
return (lchildDepth>rchildDepth)? (lchildDepth+1):(rchildDepth+1);
}
}
//交换左右子树
BTNode *swap(BTNode *b)
{
BTNode *t,*t1,*t2;
if(b==NULL)
t=NULL;
else{
t=(BTNode *)malloc(sizeof(BTNode));
t->data=b->data;
t1=swap(b->lchild); //交换左子树
t2=swap(b->rchild); //交换右子树
t->lchild=t2;
t->rchild=t1;
}
return t;
}
int main()
{
// char *str="A(B(D,F(,E)),C(G(,H),I))";
BTNode *T,*S,*M;
char *str="A(B(D(,G)),C(E,F))";
BTNode *bt=CreateBTNode(str);
DispBTNode1(bt);
printf("\n计算叶子节点数目:%d",LeafNodes(bt));
printf("\n打印交换左右子树后的二叉树\n");
T=swap(bt);
DispBTNode1(T);
// printf("查找节点:\n");
// M=FindNode(bt,3); //有点问题
// printf("%c",M->data);
printf("\n查找根节点左孩子节点:\n");
S=LchildNode(bt);
printf("查找根右节点的右孩子节点:\n");
RchildNode(bt->rchild);
printf("查找根左节点的右孩子节点:\n");
RchildNode(S);
printf("求树的高度:%d\n", BTNodeDepth(bt));
return 0;
}