typedef int Elemtype;
typedef struct BitNode
{
Elemtype data;
struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
void Createtree(BiTree B)
{
Elemtype d;
scanf("%d",&d);
if(d<=0)
B=NULL;
else
{
B=(BiTree)malloc(sizeof(BitNode));
B->data=d;
Createtree(B->lchild);
Createtree(B->rchild);
}
}
void Destroytree(BiTree B)
{
if(B)
{
Destroytree(B->lchild);
Destroytree(B->rchild);
free(B);
}
}
int Treedepth(BiTree B)
{
int ldep,rdep,max;
if(!B)
return 0;
else{
ldep=Treedepth(B->lchild);
rdep=Treedepth(B->rchild);
if(ldep>rdep)
max=ldep;
else
max=rdep;
}
return max+1;
}
void PreorderTraverse(BiTree B)
{
if(B){
printf("%d",B->data);
PreorderTraverse(B->lchild);
PreorderTraverse(B->rchild);
}
}
BiTree Searchnode(BiTree B,Elemtype e)
{
if(B)
{
if(B->data!=e)
{
Searchnode(B->lchild,e);
if(!Searchnode(B->lchild,e))
Searchnode(B->rchild,e);
}
else
return B;
}
return NULL;
}
int main()
{
int a;
BiTree T,p,lp,rp;
Createtree(T);//先序创建二叉树
PreorderTraverse(T);
p=Searchnode(T,1);
if(p)
{
lp=p->lchild;
rp=p->rchild;
if(lp)
printf("左孩子%d,",lp->data);
else
printf("无左孩子,");
if(rp)
printf("右孩子%d。\n",rp->data);
else
printf("无右孩子。\n");
} //输出“1”结点左、右节点的孩子值
printf("树的高度为%d",Treedepth(T));//树的高度
Destroytree(T);//释放树
}
void Createtree(BiTree *B)
{
Elemtype d;
scanf("%d",&d);
if(d<=0)
*B=NULL;
else
{
*B=(BiTree)malloc(sizeof(BitNode));
(*B)->data=d;
Createtree(&(*B)->lchild);
Createtree(&(*B)->rchild);
}
}
这里要用指针,否则作用不到调用那里
Createtree(T); 先序创建二叉树函数不正确,修改如下,改动处见注释,供参考:
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
typedef struct BitNode
{
Elemtype data;
struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
void Createtree(BiTree* B) //void Createtree(BiTree B) 修改
{
Elemtype d;
scanf("%d",&d);
if(d<=0)
(*B)=NULL; // B=NULL; 修改
else
{
(*B)=(BiTree)malloc(sizeof(BitNode)); // B=(BiTree)malloc(sizeof(BitNode)); 修改
(*B)->data=d; //B->data=d; 修改
Createtree(&(*B)->lchild); //Createtree(B->lchild); 修改
Createtree(&(*B)->rchild); // Createtree(B->rchild); 修改
}
}
void Destroytree(BiTree B)
{
if(B)
{
Destroytree(B->lchild);
Destroytree(B->rchild);
free(B);
}
}
int Treedepth(BiTree B)
{
int ldep,rdep,max;
if(!B)
return 0;
else{
ldep=Treedepth(B->lchild);
rdep=Treedepth(B->rchild);
if(ldep>rdep)
max=ldep;
else
max=rdep;
}
return max+1;
}
void PreorderTraverse(BiTree B)
{
if(B){
printf("%d",B->data);
PreorderTraverse(B->lchild);
PreorderTraverse(B->rchild);
}
}
BiTree Searchnode(BiTree B,Elemtype e)
{
if(B)
{
if(B->data!=e)
{
Searchnode(B->lchild,e);
if(!Searchnode(B->lchild,e))
Searchnode(B->rchild,e);
}
else
return B;
}
return NULL;
}
int main()
{
int a;
BiTree T,p,lp,rp;
Createtree(&T); //Createtree(T);//先序创建二叉树 修改
PreorderTraverse(T);
p=Searchnode(T,1);
if(p)
{
lp=p->lchild;
rp=p->rchild;
if(lp)
printf("左孩子%d,",lp->data);
else
printf("无左孩子,");
if(rp)
printf("右孩子%d。\n",rp->data);
else
printf("无右孩子。\n");
} //输出“1”结点左、右节点的孩子值
printf("树的高度为%d",Treedepth(T));//树的高度
Destroytree(T);//释放树
return 0;
}