第一种做法:

/*=================
函数功能:计算叶子结点,查找x,计算x左子树
作者:令狐荣豪
时间:2019/5/
==================*/
#include<stdio.h>
#include<stdlib.h>
#define
#define
#define
#define

//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
#define
#define
#define

//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
#define
#define
#define

//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;

计科一二班算法数据结构实验9答案_结点