数据结构-二叉树 链式 c

百度了一下,下面的比较符合个人胃口,具体出处还真忘了,学习。

#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);
			}
		}
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值