第一种做法:
/*================= 函数功能:计算叶子结点,查找x,计算x左子树 作者:令狐荣豪 时间:2019/5/ ==================*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define MAXSIZE 10 //Status函数的类型,其值是函数结果状态代码,如OK等 typedef int Status; typedef char DataType; //二叉树链式存储的结构体 typedef struct Node { DataType data; struct Node *lchild; struct Node *rchild; }BiTNode, *BiTree; BiTree TRoot; //先序序列创建二叉树 Status CreateBiTree(BiTree *T)//&的意思是传进来节点指针的引用,目的是让传递进来的指针发生改变 { char ch; scanf("%c", &ch); //输入字符 if (ch == '#') //判断字符是否为“#” *T = NULL; //将根节点置为NULL,结束该分支的的递归 else { if (!(*T = (BiTree)malloc(sizeof(BiTNode)))) //创建新结点空间 return OVERFLOW; //空间分配不成功则返回OVERFLOW (*T)->data = ch; //将字符存储到结点的值域 CreateBiTree(&(*T)->lchild); //递归创建左子树 CreateBiTree(&(*T)->rchild); //递归创建右子树 } return OK; } void InOrderOut(BiTree T)//中序遍历一遍 { if (T) { InOrderOut(T->lchild); printf("%3c", T->data); InOrderOut(T->rchild); } } //求二叉树叶子结点个数 int CountLeaf(BiTree T) { if (T == NULL){ return (0); } if (T->lchild == NULL&&T->rchild == NULL) { return (1); } return (CountLeaf(T->lchild) + CountLeaf(T->rchild)); } //在树中查找x是否存在 BiTree Search(BiTree T, DataType x) { if (T->data == x) return T; if (T->lchild !=NULL) return Search(T->lchild, x); if (T->rchild != NULL) return Search(T->rchild, x); return NULL; } //查找T的左孩子 BiTree SearchLchild(BiTree T) { BiTree p; if (T == NULL) return NULL; else return (T->lchild); } int main() { DataType x; BiTree p, q; printf("请输入先序序列(虚结点用#表示):\n"); if (CreateBiTree(&TRoot) == OK) printf("二叉树创建成功!\n"); InOrderOut(TRoot); printf("\n叶子结点数为:%d\n", CountLeaf(TRoot)); x=getchar();//消除存储区的回车字符 printf("请输入要查找的元素:\n"); x=getchar(); p=Search(TRoot, x); if (p) printf("存在\n"); else printf("不存在\n"); q=SearchLchild(p); if (q) printf("左结点为%c",q->data); //其他操作代码 return 0;
第二种做法:
/*================= 函数功能:计算叶子结点,查找x,计算x左子树 作者:令狐荣豪 时间:2019/5/ ==================*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define MAXSIZE 10 //Status函数的类型,其值是函数结果状态代码,如OK等 typedef int Status; typedef char DataType; //二叉树链式存储的结构体 typedef struct Node { DataType data; struct Node *lchild; struct Node *rchild; }BiTNode, *BiTree; BiTree TRoot; //先序序列创建二叉树 Status CreateBiTree(BiTree *T)//&的意思是传进来节点指针的引用,目的是让传递进来的指针发生改变 { char ch; scanf("%c", &ch); //输入字符 if (ch == '#') //判断字符是否为“#” *T = NULL; //将根节点置为NULL,结束该分支的的递归 else { if (!(*T = (BiTree)malloc(sizeof(BiTNode)))) //创建新结点空间 return OVERFLOW; //空间分配不成功则返回OVERFLOW (*T)->data = ch; //将字符存储到结点的值域 CreateBiTree(&(*T)->lchild); //递归创建左子树 CreateBiTree(&(*T)->rchild); //递归创建右子树 } return OK; } void InOrderOut(BiTree T)//中序遍历一遍 { if (T) { InOrderOut(T->lchild); printf("%3c", T->data); InOrderOut(T->rchild); } } //求二叉树叶子结点个数 int CountLeaf(BiTree T) { if (T == NULL){ return (0); } if (T->lchild == NULL&&T->rchild == NULL) { return (1); } return (CountLeaf(T->lchild) + CountLeaf(T->rchild)); } //在树中查找x是否存在 BiTree Search(BiTree T, DataType x) { if (T->data == x) return T; if (T->lchild !=NULL) return Search(T->lchild, x); if (T->rchild != NULL) return Search(T->rchild, x); return NULL; } //查找T的左孩子 BiTree SearchLchild(BiTree T) { BiTree p; if (T == NULL) return NULL; else return (T->lchild); } int main() { DataType x; BiTree p, q; printf("请输入先序序列(虚结点用#表示):\n"); if (CreateBiTree(&TRoot) == OK) printf("二叉树创建成功!\n"); InOrderOut(TRoot); printf("\n叶子结点数为:%d\n", CountLeaf(TRoot)); printf("请输入要查找的元素:\n"); scanf("%s", &x); p=Search(TRoot, x); if (p) printf("存在\n"); else printf("不存在\n"); q=SearchLchild(p); if (q) printf("左结点为%c",q->data); //其他操作代码 return 0; }
第三种做法:
/*================= 函数功能:计算叶子结点,查找x,计算x左子树 作者:令狐荣豪 时间:2019/5/ ==================*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define MAXSIZE 10 //Status函数的类型,其值是函数结果状态代码,如OK等 typedef int Status; typedef char DataType; //二叉树链式存储的结构体 typedef struct Node { DataType data; struct Node *lchild; struct Node *rchild; }BiTNode, *BiTree; BiTree TRoot; //先序序列创建二叉树 Status CreateBiTree(BiTree *T)//&的意思是传进来节点指针的引用,目的是让传递进来的指针发生改变 { char ch; scanf("%c", &ch); //输入字符 if (ch == '#') //判断字符是否为“#” *T = NULL; //将根节点置为NULL,结束该分支的的递归 else { if (!(*T = (BiTree)malloc(sizeof(BiTNode)))) //创建新结点空间 return OVERFLOW; //空间分配不成功则返回OVERFLOW (*T)->data = ch; //将字符存储到结点的值域 CreateBiTree(&(*T)->lchild); //递归创建左子树 CreateBiTree(&(*T)->rchild); //递归创建右子树 } return OK; } void InOrderOut(BiTree T)//中序遍历一遍 { if (T) { InOrderOut(T->lchild); printf("%3c", T->data); InOrderOut(T->rchild); } } //求二叉树叶子结点个数 int CountLeaf(BiTree T) { if (T == NULL){ return (0); } if (T->lchild == NULL&&T->rchild == NULL) { return (1); } return (CountLeaf(T->lchild) + CountLeaf(T->rchild)); } //在树中查找x是否存在 BiTree Search(BiTree T, DataType x) { if (T->data == x) return T; if (T->lchild !=NULL) return Search(T->lchild, x); if (T->rchild != NULL) return Search(T->rchild, x); return NULL; } //查找T的左孩子 BiTree SearchLchild(BiTree T) { BiTree p; if (T == NULL) return NULL; else return (T->lchild); } int main() { DataType x; BiTree p, q; printf("请输入先序序列(虚结点用#表示):\n"); if (CreateBiTree(&TRoot) == OK) printf("二叉树创建成功!\n"); InOrderOut(TRoot); printf("\n叶子结点数为:%d\n", CountLeaf(TRoot)); //少用这种%c的输入法 scanf("%c",&x);//消除存储区的回车字符 printf("请输入要查找的元素:\n"); scanf("%c",&x); p=Search(TRoot, x); if (p) printf("存在\n"); else printf("不存在\n"); q=SearchLchild(p); if (q) printf("左结点为%c",q->data); //其他操作代码 return 0;