打印菜单界面,用c语言实现二叉树的基本操作

打印菜单界面,用c语言实现二叉树的基本操作:

其代码原理和用c++实现一样,请看本人上篇博客:二叉树的先序、中序、后序遍历等基本操作c++实现,链接:http://yaoyaolx.blog.51cto.com/10732111/1783527

实现代码:

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 50

//定义二叉树的二叉链表结构

typedef struct Node

{

char data;

struct Node *LChild;

struct Node *RChild;

}BiTNode, *BiTree;

typedef struct

{

BiTree element[MAXSIZE];

int front;//队头

int rear;//队尾

}SeqQueue;

//初始化队列

void InitQueue(SeqQueue *Q)

{

Q->front = Q->rear = 0;

}

//入队

int EnterQueue(SeqQueue *Q, BiTree bt)

{

if ((Q->rear + 1) % MAXSIZE == Q->front)

{

return 0;

}

else

{

Q->element[Q->rear] = bt;

Q->rear = (Q->rear + 1) % MAXSIZE;

return 1;

}

}

//出队

int DeleteQueue(SeqQueue *Q, BiTree *bt)

{

if (Q->front == Q->rear)

{

return 0;

}

else

{

*bt = Q->element[Q->front];

Q->front = (Q->front + 1) % MAXSIZE;

return 1;

}

}

//判断队列是否为空

int IsEmpty(SeqQueue *Q)

{

if (Q->front == Q->rear)

{

return 1;

}

else

{

return 0;

}

}

//用拓展先序遍历序列创建二叉链表

void CreateBiTree(BiTree *bt)

{

char ch;

ch = getchar();

if (ch == ‘\n‘)

{

return;

}

if (ch == ‘#‘)

{

*bt = NULL;

}

else

{

*bt = (BiTree)malloc(sizeof(BiTNode));

(*bt)->data = ch;

CreateBiTree(&((*bt)->LChild));

CreateBiTree(&((*bt)->RChild));

}

}

//先序遍历输出二叉树的结点,根结点->左子树->右子树,root为指向二叉树(或某一子树)根结点的指针

void PreOrder(BiTree root)

{

if (root != NULL)

{

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

PreOrder(root->LChild);//遍历左子树

PreOrder(root->RChild);//遍历右子树

}

}

//中序遍历输出二叉树的结点,左子树->根结点->右子树

void InOrder(BiTree root)

{

if (root != NULL)

{

InOrder(root->LChild);

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

InOrder(root->RChild);

}

}

//中序非递归遍历输出二叉树的结点

void InOrderNo(BiTree root)

{

int top = 0;

BiTree p = root;

BiTree s[MAXSIZE] = { NULL };

do {

while (p != NULL)

{

if (top > MAXSIZE)

{

return;

}

else

{

top++;

s[top] = p;

p = p->LChild;

}

}

if (top != 0)

{

p = s[top];

top--;

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

p = p->RChild;

}

} while (p != NULL || top != 0);

}

//后序遍历输出二叉树的结点,左子树->右子树->根结点

void PostOrder(BiTree root)

{

if (root != NULL)

{

PostOrder(root->LChild);

PostOrder(root->RChild);

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

}

}

//桉树状打印二叉树,逆中序

void PrintTree(BiTree root, int nLayer)

{

if (root == NULL)

{

return;

}

else

{

PrintTree(root->RChild, nLayer + 1);

for (int i = 0; i < nLayer; i++)

{

printf("   ");

}

printf("%c\n", root->data);

PrintTree(root->LChild, nLayer + 1);

}

}

//层序遍历二叉树

void LayerOrder(BiTree root)

{

SeqQueue Q;

BiTree p = NULL;

InitQueue(&Q);

if (root == NULL)

{

return;

}

else

{

EnterQueue(&Q, root);

while (!IsEmpty(&Q))

{

DeleteQueue(&Q, &p);

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

if (p->LChild != NULL)

{

EnterQueue(&Q, p->LChild);

}

if (p->RChild != NULL)

{

EnterQueue(&Q, p->RChild);

}

}

return 1;

}

}

//求二叉树的高度

int PostTreeDepth(BiTree root)

{

int hl = 0;

int hr = 0;

int max = 0;

if (root != NULL)

{

hl = PostTreeDepth(root->LChild);

hr = PostTreeDepth(root->RChild);

max = (hl > hr) ? hl : hr;

return max + 1;

}

else

{

return 0;

}

}

//二叉树的结点个数

int RootCount(BiTree root)

{

int count = 1;

if (root != NULL)

{

count += (RootCount(root->LChild) + RootCount(root->RChild));

}

else

{

count = 0;

}

return count;

}

//二叉树的叶子结点个数

int LeafCount(BiTree root)

{

int leafCount = 0;

if (root == NULL)

{

leafCount = 0;

}

else if ((root->LChild == NULL) && (root->RChild == NULL))

{

leafCount = 1;

}

else

{

leafCount = (LeafCount(root->LChild) + LeafCount(root->RChild));

}

return leafCount;

}

//交换二叉树每个结点的左子树和右子树

void ChangeLeftRight(BiTree *bt)

{

if ((*bt)->LChild == NULL && (*bt)->RChild == NULL)

{

return;

}

else

{

BiTree tmp = (*bt)->LChild;

(*bt)->LChild = (*bt)->RChild;

(*bt)->RChild = tmp;

if ((*bt)->LChild != NULL)

{

ChangeLeftRight(&((*bt)->LChild));

}

if ((*bt)->RChild != NULL)

{

ChangeLeftRight(&((*bt)->RChild));

}

}

}

void maue()

{

printf("\n");

printf("   ☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆\n");

printf("    ☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★       7、二叉树的层序遍历       ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★      10、二叉树的叶子结点个数       ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆ \n");

printf("    ☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆ \n");

printf("\n");

}

int main()

{

BiTree bt = NULL;

int number = 0;

do {

maue();

printf("请选择您要进行的本系统的功能: > ");

scanf_s("%d", &number);

switch (number)

{

case 1:

printf("请输入二叉树的扩展先序遍历序列:> ");

getchar();

CreateBiTree(&bt);

printf("\n");

break;

case 2:

printf("此二叉树的先序遍历序列为:> ");

PreOrder(bt);

printf("\n");

break;

case 3:

printf("此二叉树的中序遍历序列为:> ");

InOrder(bt);

printf("\n");

break;

case 4:

printf("此二叉树的非递归中序遍历序列为:> ");

InOrderNo(bt);

printf("\n");

break;

case 5:

printf("此二叉树的后序遍历序列为:> ");

PostOrder(bt);

printf("\n");

break;

case 6:

printf("树状打印此二叉树为:>\n ");

PrintTree(bt, 2);

printf("\n");

break;

case 7:

printf("层次遍历印此二叉树为:> ");

LayerOrder(bt);

printf("\n");

break;

case 8:

printf("此二叉树的高度为:> ");

int heigh = PostTreeDepth(bt);

printf("heigh = %d\n", heigh);

break;

case 9:

printf("此二叉树的结点个数为:> ");

int rootCount = RootCount(bt);

printf("rootCount = %d\n", rootCount);

break;

case 10:

printf("此二叉树的叶子结点个数为:> ");

int leafCount = LeafCount(bt);

printf("leafCount = %d\n", leafCount);

break;

case 11:

printf("交换二叉树每个结点的左子树和右子树后,二叉树变为(先序遍历):>\n ");

ChangeLeftRight(&bt);

PreOrder(bt);

printf("\n");

break;

case 0:

printf("感谢您使用本系统,欢迎您的再次使用!\n");

break;

default:

printf("请输入正确的功能号:\n");

break;

}

} while (number);

system("pause");

return 0;

}

运行结果:

☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆

☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆

☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆

☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆

☆☆☆★★★★★       7、二叉树的层序遍历       ★★★★★☆☆☆

☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆

☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆

☆☆☆★★★★★      10、二叉树的叶子结点个数       ★★★★★☆☆☆

☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆

☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆

请选择您要进行的本系统的功能: > 1

请输入二叉树的扩展先序遍历序列:> 123##4##56###

☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆

☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆

☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆

☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆

☆☆☆★★★★★       7、二叉树的层序遍历       ★★★★★☆☆☆

☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆

☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆

☆☆☆★★★★★      10、二叉树的叶子结点个数       ★★★★★☆☆☆

☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆

☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆

请选择您要进行的本系统的功能: > 6

树状打印此二叉树为:>

5

6

1

4

2

3

☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆

☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆

☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆

☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆

☆☆☆★★★★★       7、二叉树的层序遍历       ★★★★★☆☆☆

☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆

☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆

☆☆☆★★★★★      10、二叉树的叶子结点个数       ★★★★★☆☆☆

☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆

☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆

请选择您要进行的本系统的功能: > 2

此二叉树的先序遍历序列为:> 1  2  3  4  5  6

☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆

☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆

☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆

☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆

☆☆☆★★★★★       7、二叉树的层序遍历       ★★★★★☆☆☆

☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆

☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆

☆☆☆★★★★★      10、二叉树的叶子结点个数       ★★★★★☆☆☆

☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆

☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆

请选择您要进行的本系统的功能: > 3

此二叉树的中序遍历序列为:> 3  2  4  1  6  5

☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆

☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆

☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆

☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆

☆☆☆★★★★★       7、二叉树的层序遍历       ★★★★★☆☆☆

☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆

☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆

☆☆☆★★★★★      10、二叉树的叶子结点个数       ★★★★★☆☆☆

☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆

☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆

请选择您要进行的本系统的功能: > 11

交换二叉树每个结点的左子树和右子树后,二叉树变为(先序遍历):>

1  5  6  2  4  3

☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆

☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆

☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆

☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆

☆☆☆★★★★★       7、二叉树的层序遍历       ★★★★★☆☆☆

☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆

☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆

☆☆☆★★★★★      10、二叉树的叶子结点个数       ★★★★★☆☆☆

☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆

☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆

请选择您要进行的本系统的功能: > 9

此二叉树的结点个数为:> rootCount = 6

☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆

☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆

☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆

☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆

☆☆☆★★★★★       7、二叉树的层序遍历       ★★★★★☆☆☆

☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆

☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆

☆☆☆★★★★★      10、二叉树的叶子结点个数       ★★★★★☆☆☆

☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆

☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆

请选择您要进行的本系统的功能: > 8

此二叉树的高度为:> heigh = 3

☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆

☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆

☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆

☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆

☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆

☆☆☆★★★★★       7、二叉树的层序遍历       ★★★★★☆☆☆

☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆

☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆

☆☆☆★★★★★      10、二叉树的叶子结点个数       ★★★★★☆☆☆

☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆

☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆

请选择您要进行的本系统的功能: > 0

感谢您使用本系统,欢迎您的再次使用!

请按任意键继续. . .

时间: 2024-07-30 10:15:34

打印菜单界面,用c语言实现二叉树的基本操作的相关文章

c语言:编写一个简易计算器,打印菜单界面,实现加减乘除运算,可以退出菜单界面

.编写一个简易计算器 程序: #include<stdio.h> enum  OP { EXIT,//0 ADD,//1 SUB,//2 MUL,//3 DIV//4 }; void menu()//menu表示菜单 { printf("**** 1.add  ****\n"); printf("**** 2.sub  ****\n"); printf("**** 3.mul  ****\n"); printf("**** 

C语言实现二叉树的基本操作

我在前面的博客中讲解了链表.栈和队列,这些数据结构其实都是线性表,并且给出了详细的实现.从今天开始,我们将要来学习树,树作为一种数据结构我们经常会用到,作为起步和基础,我们先来实现二叉树,也就是每个节点有不超过2个子节点的树.对于树的操作,最基本的创建.遍历.求树高.节点数等.代码上传至 https://github.com/chenyufeng1991/BinaryTree . (1)节点的定义 typedef int elemType; typedef struct BTNode{ elem

Lodop打印设计界面生成代码带”...(省略)”

Lodop的设计界面中,菜单里的生成代码,如果打印项内容过多,后面会显示"...(省略)",省略的是打印项的内容值,无论是纯文本还是超文本,都可以用选中打印项-右键-设置属性里找到该打印项的全部值,可以复制出来放到值的那个参数里.选中打印项-右键-设置属性-切换到值得那个标签选项.双击选中的打印项也可以,不过有时可能弹出框到打印设计界面后面去了,因此建议右键-设置属性. 打印设计(LODOP.PRINT_DESIGN())关闭后,可以返回完整的打印设计代码,没有"...(省略

游戏菜单界面设计 与 游戏整合

小时候一直觉得4399小游戏的那些游戏菜单好low,现在做完我的菜单界面回去去看看感觉还不错... 菜单制作过程 完整代码 https://paste.ubuntu.com/p/HZBWXMWT8K/ 详细介绍: <!--more--> 前言 从走迷宫起,到五子棋,再到做完象棋,再到去学下图书馆管理系统程序设计.其实我对做游戏或管理系统不是有很大兴趣,之前觉得设计界面麻烦,觉得c语言书上那个图书馆管理系统程序好无聊,还觉得做游戏又麻烦又累,然后自从那天学会简单的wasd移动得知原来可以这么巧妙

Android Design Support Library(二)用NavigationView实现抽屉菜单界面

NavigationView在MD设计中很重要,之前Google也提出了使用DrawerLayout来实现导航抽屉. 这次,在Android Design Support Library中,Google提供了NavigationView来实现导航菜单界面. 这次我们写的代码在Android用TabLayout实现相似网易选项卡动态滑动效果这篇文章代码的基础上进行改动,所以最好先看看上面这篇文章 首先仍旧是配置build.gradle: dependencies { compile fileTre

C语言实现二叉树-利用二叉树统计单词数目

昨天刚参加了腾讯2015年在线模拟考: 四道大题的第一题就是单词统计程序的设计思想: 为了记住这一天,我打算今天通过代码实现一下: 我将用到的核心数据结构是二叉树: (要是想了解简单二叉树的实现,可以参考我的另一篇文章:http://www.cnblogs.com/landpack/p/4783120.html) Problem 我需要统计的单词是在程序直接硬编码的: 这样做得原因是省略了文件输入输出所带来的困惑: 我的每篇文章,一般只说一个主题: 这样也方便我日后复习: Solution 首先

Android用NavigationView实现抽屉菜单界面

NavigationView在MD设计中非常重要,之前Google也提出了使用DrawerLayout来实现导航抽屉.这次,在Android Design Support Library中,Google提供了NavigationView来实现导航菜单界面. 这次我们写的代码在Android用TabLayout实现类似网易选项卡动态滑动效果这篇文章代码的基础上进行修改,所以最好先看看上面这篇文章 首先仍旧是配置build.gradle: dependencies { compile fileTre

设置Firefox(火狐)浏览器的中文菜单/界面

步骤一: 设置Firefox浏览器的中文菜单/界面.首先需要查一下正在使用的火狐版本号(小生使用的火狐版本是55.0.3).      步骤二: 下载对应版本的xpi中文插件 其次,访问下面的火狐官方地址:http://releases.mozilla.org/pub/firefox/releases/ 然后,找到对应的版本型号文件目录及操作系统:(小生的火狐版本是:55.0.3,所以在" http://releases.mozilla.org/pub/firefox/releases/55.0

C语言实现二叉树-02版

---恢复内容开始--- 昨天,提交完我们的二叉树项目后,今天早上项目经理早早给我打电话: 他说,小伙子干的不错.但是为什么你上面的insert是recusive的呢? 你难道不知道万一数据量大啦!那得消耗很多内存哈!: 我大吃一惊,那么项目经理果然不是吃素的,他是在提醒我别投机取巧啦: 我们都知道递归实现树是比较简单的一种方式: 的确它的性能比较差,试想每次递归都要把当前函数压栈,然后出栈.. 好啦,那咱们今天就用非递归实现它:反正今天我就不干别的啦: Problem 下面的代码你应该比较熟习