①、编写创建二叉树的算法;
②、编写查找节点的算法;
③、编写找孩子节点的算法;
④、编写求二叉树高度的算法;
⑤、编写输出二叉树的算法;
⑥、编写先序遍历递归算法;
⑦、编写主函数。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
#define MaxSize 50
//①:
void CreateBTNode(BTNode * &b,char *str){
BTNode *St[MaxSize], *p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL; //建立的二叉树初始时为空
ch=str[j];
while (ch!='\0') //str未扫描完时循环
{
switch(ch){
case '(':
top++; St[top]=p; k=1; break;//为左孩子节点
case ')':top--;break;
case ',':k=2; break;
//为孩子节点右节点
default:
p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if (b==NULL) //p为二叉树的根节点
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){
return p->lchild;
}
BTNode *RchildNode(BTNode *p){
return p->rchild;
}
//④:
int BTNodeDepth(BTNode *b)
{ int lchilddep,rchilddep;
if (b==NULL)
return(0); //空树的高度为0
else{
lchilddep=BTNodeDepth(b->lchild); //求左子树的高度为lchilddep
rchilddep=BTNodeDepth(b->rchild); //求右子树的高度为rchilddep
return (lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1);
}
}
//⑤:
void DispBTNode(BTNode *b)
{ if (b!=NULL)
{ printf("%c",b->data);
if (b->lchild!=NULL || b->rchild!=NULL)
{ printf("(");
DispBTNode(b->lchild); //递归处理左子树
if (b->rchild!=NULL) printf(",");
DispBTNode(b->rchild); //递归处理右子树
printf(")");
}
}
}
//⑥:
void PreOrder(BTNode *b){
if (b!=NULL){
printf("%c ",b->data); //访问根节点
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
//⑦:
void main(){
char str[] = "A(B(D(,G)),C(E,F))";
BTNode *b;
CreateBTNode(b,str);
printf("输出二叉树:\n");
printf("\n");
DispBTNode(b);
printf("\n");
printf("二叉树的高度是:\n");
int h = BTNodeDepth(b);
printf("\n");
printf("%d",h);
printf("\n");
printf("二叉树的左孩子:\n");
BTNode *lchild = LchildNode(b);
printf("\n");
DispBTNode(lchild);
printf("\n");
printf("二叉树的右孩子:\n");
BTNode *rchild = RchildNode(b);
printf("\n");
DispBTNode(rchild);
printf("\n");
printf("查找“D”的二叉树节点:\n");
BTNode *child = FindNode(b,'D');
printf("\n");
DispBTNode(child);
printf("\n");