数据结构-二叉树 链式 c

来源:互联网 发布:emlog5.3.1源码下载 编辑:程序博客网 时间:2024/06/13 03:44

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

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


原创粉丝点击