二叉树深度计算也就是对二叉树层数这个递归函数的记录过程。
验证某一元素在二叉树中的存在性也就是对二叉树的一个遍历过程,如果存在相同元素,就将该树节点的地址赋给一个新的树节点。
本实验用到简单二叉树
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW 0
typedef int Status;
typedef Status ElemType;
typedef char * Tree;
typedef struct BitNode{
ElemType data; //每一个结点的数据域
struct BitNode *lchild; //每一个结点的左孩子指针域用于存放左孩子结点的地址
struct BitNode *rlight; //每一个结点的右孩子指针域用于存放右孩子结点的地址
}BitNode, *BitTree;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
Status CreateBiTree(BitTree &T);
Status getDepth(BitTree T);
void search(BitTree T,BitTree &F,char KEY);
//本实验的目的是按先序遍历的方式创建一个二叉树,然后按照中序遍历的方式实现查找,输出。
//生成二叉树的必须条件是通过递归函数对子树依次进行遍历生成,或者遍历输出。
int main(int argc, char *argv[]) {
BitTree T,F;
char KEY;
printf("请输入要查找验证的元素:");
scanf("%c",&KEY);
getchar();
printf("请输入创建的二叉树:");
printf("\n");
CreateBiTree(T);
Status m;
m=getDepth(T);
printf("该二叉树的深度是:%d",m);
printf("\n");
search(T,F,KEY);
if(F!=NULL){
printf("该二叉树中存在该元素;");
}else{
printf("该二叉树中不存在该元素;");
}
return 0;
}
Status CreateBiTree(BitTree &T){ //创建一个长度为n的完全二叉树 ,这种创建方法时按照先序遍历的方式创建的,依据根左右的顺序逐层创建
char a;
scanf("%c",&a);
if(a==' '){
T=NULL;
}else{
T=(BitNode *)malloc(sizeof(BitNode)); //申请一个结构体类型的结点空间
if(T==NULL){
exit(OVERFLOW);
}else{
T->data=a; //给结点传入数据(设置结点的数据域)
CreateBiTree(T->lchild); //按照先序遍历的顺序准则,创建左孩子,并且如若根节点的左孩子不为空,继续遍历左孩子的左孩子,如若左孩子的左孩子为空,
//然后遍历左孩子的右孩子,依此遍历创建。
CreateBiTree(T->rlight); //右孩子同样,前提是左孩子为空才可以遍历右孩子。
}
}
return OK;
}
Status getDepth(BitTree T){ //深度求法第一想法是在创建函数的时候直接在递归中用一个人变量存储嵌套的次数也就是二叉树的深度。
//但是有个问题就是如果不是标准的二叉树,在中间结点上有结点叶子,但是在起始结点没有叶子。
ElemType m,n;
if(T==NULL){
return 0; //子树均为空则返回 0
}else{
m=(getDepth(T->lchild));
n=(getDepth(T->rlight));
if(m>=n){ //这里可以用三目运算符
return m+1;
}else{
return n+1;
}
}
}
//实现查找数据域值等于key的结点是否存在,若存在则p指向该key值的结点,否则p为空。
//第一步需要将整个二叉树进行遍历。
//void search(BitTree T,BitTree &F,char KEY){ //要改变的变量就定义为引用指针
// if(T==NULL){
// exit(OVERFLOW);
// }else{
// if(T->data==KEY){
// F=T;
// }else{
// search(T->lchild,F,KEY);
// search(T->rlight,F,KEY);
// }
// }
//}
void search(BitTree T,BitTree &F,char KEY){ //要改变的变量就定义为引用指针
if(T!=NULL){
if(T->data==KEY){
F=T;
}else{
search(T->lchild,F,KEY);
if(F==NULL)
search(T->rlight,F,KEY);
}
}
}
运行结果:
出现的问题:
1,我不太清楚在输入一个字符后为什么不可以直接创建二叉树,显示是二叉树无法中止,然后在输入函数后加上getchar()函数即可实现二叉树的创建,这一块不太明白是何缘由,网上的解决方案不太认可(未解决)
2,(代码中注释的那一段寻找函数) 在验证某一函数的存在性只能遍历左子树,一到遍历右子树就自动结束。