美文网首页
2021-12-18

2021-12-18

作者: 墨鱼初耶 | 来源:发表于2021-12-18 23:25 被阅读0次

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

#define _CRT_SECURE_NO_DEPRECATE

#define Max 20 //结点的最大个数

typedef struct node{

char data;

struct node *lchild, *rchild;

}BinTNode; //自定义二叉树的结点类型

typedef BinTNode *BinTree; //定义二叉树的指针

int NodeNum, leaf; //NodeNum 为结点数,leaf 为叶子数

// 基于先序遍历算法创建二叉树

//一要求输入先序序列,其中加入虚结点"#”以示空指针的位置

BinTree CreatBinTree(void)

{

BinTree T;

char ch;

if ((ch = getchar()) = '#')

return(NULL); //读入#, 返回空指针

else

{

T = (BinTNode *)malloc(sizeof(BinTNode)); //生成结点

T->data = ch;

T->lchild = CreatBinTree(); //构造左子树

T->rchild = CreatBinTree(); //构造右子树

return(T);

}

}

//———— —NLR先序遍历 :

void Preorder(BinTree T)

{

if (T){

printf("%c",T->data); //访问结点

Preorder(T->lchild); //先序遍历左子树

Preorder(T->rchild); //先序遍历右子树

}

}

// LNR中序遍历=

void Inorder(BinTree T)

{

if (T) {

Inorder(T->lchild);

printf("%c ", T->data);

Inorder(T->rchild);

}

}

// LRN后序遍历-

void Postorder(BinTree T) //中序遍历左子树

//访问结点

//中序遍历右子树

{

if (T) {

Postorder(T->lchild); //后序遍历左子树

Postorder(T->rchild); //后序遍历右子树

printf("%c", T->data);  //访问结点

}

}

//=======采用后序遍历求二叉树的深度、节点数及叶子数的递归算法=======

int TreeDepth(BinTree T)

{

int hl, hr, max;

if(T){

hl=TreeDepth(T->lchild); //求左深度

hr=TreeDepth(T->rchild); //求右深度

max=hl>hr?hl:hr; //取左右深度的最大值

NodeNum=NodeNum+1; //求结点数

if(hl==0&&hr == 0)leaf = leaf + 1; //若左右深度为 0,即为叶子。

return(max + 1);

}

else return(0);

}

// = 利用”先进先出"(FIFO)队列,按层次遍历二叉树

void Levelorder(BinTree T)

{

int front = 0, rear = 1;

BinTNode*cq[Max], *p; //定义结点的指针数组cq

cq[1] = T; //根入队

while (front != rear)

{

front = (front + 1) % NodeNum;

p = cq[front]; //出队

printf("%c", p->data); //出队,输出结点的值

if (p->lchild != NULL){

rear = (rear + 1) % NodeNum;

cq[rear] = p->lchild; //左子树入队

}

if (p->rchild != NULL) {

rear = (rear + 1) % NodeNum;

cq[rear] = p->rchild; //右子树入队

}

}

}

//一数叶子节点个数一

int countleaf(BinTree T)

{

int hl, hr;

if (T){

hl = countleaf(T->lchild);

hr = countleaf(T->rchild);

if (hl == 0 && hr == 0) //若左右深度为0, 即为叶子。

return(1);

else return hl + hr;

}

else return 0;

}

//=——=± 函 数:

int main()

{

BinTree root;

char i;

int depth;

printf("\n");

printf("Creat Bin_Tree; Input preorder:"); //输入完全二叉树的先序序列,

//用#代表虚结点,如ABD###CE##F##

root = CreatBinTree(); //创建二叉树,返回根结点

do{        //从菜单中选择遍历方式,输入序号。

printf("\t********** select ************\n");

printf("\t1: Preorder Traversal\n");

printf("\t2: lorder Traversal\n");

printf("\t3: Postorder traversal\n");

printf("\t4: PostTreeDepth, Node number, Leaf number\n");

printf("\t5: Level Depth\n"); //按层次遍历之前,先选铉4,求出该树的结 点数。

printf("\tO: Exit\n");

printf("\t*******************************\n");

fflush(stdin); //刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

scanf_s ("%c", &i); //输入菜单序号(0 - 5)

switch (i - '0'){

case 1:

printf("Print Bin_tree Preorder:");

Preorder(root); //先序遍历

break;

case 2:

printf("Print Bin Tree Inorder:");

Inorder(root); //中序遍历

break;

case 3:

printf("Print Bin Tree Postorder:");

Postorder(root); //后序遍历

break;

case 4:

depth = TreeDepth(root); //求树的深度及叶子数

printf("BinTree Depth=%d BinTree Node number=%d", depth, NodeNum);

printf(" BinTree Leaf number=%d", countleaf(root));

break;

case 5: printf("LevePrint Bin_Tree");

Levelorder(root); //按层次遍历

break;

default: exit(1);

}

printf("\n");

} while (i!=0);

system("pause");

return (0);

}

数据结构实验关于二叉树的问题

C语言数据结构的问题还

关于图片提取文字就是一定要注意断行,对代码的审核,

函数未声明

原因一:是对函数在int函数后面未声明

出现必须是可改变的左值可能是对函数进行for循环判断时的等号的输入

要注意代码的准确性,先用笨办法进行检查,养成良好的输入习惯

作为一个初学者对基本的问题理解

————————————————

版权声明:本文为CSDN博主「B_planzp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/B_planzp/article/details/121877955

相关文章

网友评论

      本文标题:2021-12-18

      本文链接:https://www.haomeiwen.com/subject/zesnfrtx.html