百度了一下,下面的比较符合个人胃口,具体出处还真忘了,学习。
#include<stdio.h>
#include<stdlib.h>
typedef struct bitree{
int data;
struct bitree *lchild;
struct bitree *rchild;
}bitreenode,*bitreelink;
bitreelink creat();//构建二叉树
void parent(bitreelink,int);//查询二叉树中某结点的双亲
void lchild(bitreelink,int);//查询二叉树中某结点的左孩子
void rchild(bitreelink,int);//查询二叉树中某结点的右孩子
void lsibling(bitreelink,int);//查询二叉树中某结点的左兄弟结点
void rsibling(bitreelink,int);//查询二叉树中某结点的右兄弟结点
int main()
{
bitreelink T;
int e,n;
do{
printf("__________________________________\n");
printf("1、构建二叉树\n");
printf("2、查询二叉树中某结点的双亲\n");
printf("3、查询二叉树中某结点的左孩子\n");
printf("4、查询二叉树中某结点的右孩子\n");
printf("5、查询二叉树中某结点的左兄弟结点\n");
printf("6、查询二叉树中某结点的右兄弟结点\n");
printf("__________________________________\n");
printf("请输入要选择的操作n:\n");
scanf("%d",&n);
switch(n)
{
case 1:
printf("输入根结点:\n");
T=creat();
break;
case 2:
printf("请输入要查询双亲的结点:");
scanf("%d",&e);
parent(T,e);
break;
case 3:
printf("请输入要查询左孩子的结点:");
scanf("%d",&e);
lchild(T,e);
break;
case 4:
printf("请输入姚查询右孩子的结点:");
scanf("%d",&e);
rchild(T,e);
break;
case 5:
printf("请输入要查询左兄弟的结点:");
scanf("%d",&e);
lsibling(T,e);
break;
case 6:
printf("请输入要查询右兄弟的结点:");
scanf("%d",&e);
rsibling(T,e);
break;
}
}while(n<7);
return 0;
}
/*二叉树的初始化
*其中‘0’表示空节点
*/
bitreelink creat()
{
bitreelink T;
int data;
scanf("%d",&data);
if(data==0)
{
T=NULL;
}
else
{
T=(bitreelink)malloc(sizeof(bitreenode));
if(NULL==T)
{
printf("Error!!");
exit(1);
}
else
{
T->data=data;
printf("输入%d结点的左结点:",T->data);
T->lchild=creat();
printf("输入%d结点的右结点:",T->data);
T->rchild=creat();
}
}
return T;
}
/*查询二叉树中某结点的双亲节点*/
void parent(bitreelink T,int e)
{
if(T!=NULL)
{
if(T->lchild!=NULL)
{
if(e==T->lchild->data)
{
printf("结点%d的双亲是:%d\n",e,T->data);
}
else
{
parent(T->lchild,e);
}
}
if(T->rchild!=NULL)
{
if(e==T->rchild->data)
{
printf("结点%d的双亲是:%d\n",e,T->data);
}
else
{
parent(T->rchild,e);
}
}
}
}
/*查询二叉树中某结点的左孩子*/
void lchild(bitreelink T,int e)
{
if(T!=NULL)
{
if(e==T->data)
{
if(T->lchild!=NULL)
{
printf("结点%d的左孩子是:%d \n",e,T->lchild->data);
}
else
{
printf("结点%d没有左孩子!!!",e);
}
}
else
{
//根节点不是目标节点,则遍历左右子树
lchild(T->lchild,e);
lchild(T->rchild,e);
}
}
}
/*查询二叉树中某结点的右孩子*/
void rchild(bitreelink T,int e)
{
if(T!=NULL)
{
if(e==T->data)
{
if(T->rchild!=NULL)
{
printf("结点%d的右孩子是:%d \n",e,T->rchild->data);
}
else
{
printf("结点%d没有右孩子!!",e);
}
}
else
{
//跟节点不是目标节点,则遍历左右子树
rchild(T->lchild,e);
rchild(T->rchild,e);
}
}
}
/*查询二叉树中某结点的左兄弟结点*/
void lsibling(bitreelink T,int e)
{
if(NULL==T)
{
exit(0);
}
else
{
if(T->lchild!=NULL)
{
if(e==T->lchild->data)
{
printf("结点%d没有左兄弟结点!\n",e);
}
else
{
lsibling(T->lchild,e);
}
}
if(T->rchild!=NULL)
{
if(e==T->rchild->data)
{
if(T->lchild!=NULL)
{
printf("结点%d的左兄弟结点是:%d\n",e,T->lchild->data);
}
else
{
printf("结点%d没有左兄弟结点!!\n",e);
}
}
else
{
lsibling(T->rchild,e);
}
}
}
}
/*查询二叉树中某结点的右兄弟结点*/
void rsibling(bitreelink T,int e)
{
if(NULL==T)
{
exit(0);
}
else
{
if(T->lchild!=NULL)
{
if(e==T->lchild->data)
{
if(T->rchild!=NULL)
{
printf("结点%d的右兄弟结点是:%d",e,T->rchild->data);
}
else
{
printf("结点%d没有右兄弟!!!",e);
}
}
else
{
rsibling(T->lchild,e);
}
}
if(T->rchild!=NULL)
{
if(e==T->rchild->data)
{
printf("结点%d没有右兄弟!!",e);
}
else
{
rsibling(T->rchild,e);
}
}
}
}