二叉树基本操作(C语言实现)
/*
*@author:orsrrc
*CSDN:https://blog.csdn.net/qq_52321992?type=blog
* 博客园:https://www.cnblogs.com/orsrrc/
*/
注:本篇中涉及C++中的传递引用等方法,所以在创建源文件时文件后缀为.cpp,.cpp文件是向下兼容的,所以当我们使用C语言语句也可以编译成功。
由于使用VS编译时采用新的规则,原本的Scanf函数等不适用本规则会提示使用scanf_f函数或者_CRT_SECURE_NO_WARNINGS。这里我们使用_CRT_SECURE_NO_WARNINGS,方便阅读。如果你用的编译器不是VS的可以不在首行添加这一句
//先序遍历的顺序建立二叉链表
BiTree CreateBiLinkTree(BiTree &T) {
getchar();
char enter_number;
printf("请输入当前节点的值:");
scanf("%c", &enter_number);
if (enter_number == '#')//当输入的值为'#'时代表当前节点的值为空
{
T = NULL;
}
else {
T = (BiTree)malloc(sizeof(BiTNode));
T->data = enter_number;
CreateBiLinkTree(T->Lchild);
printf("当前结点的值为空,输入另一个结点\n");
CreateBiLinkTree(T->Rchild);
}
return T;
}
//递归先序遍历该二叉链表树
void PreRTraverse (BiTree &T) { /
if (T != NULL)
{
printf("%c", T->data);
PreRTraverse(T->Lchild);
PreRTraverse(T->Rchild);
}
}
//递归中序遍历该二叉链表树
void MidRTraverse (BiTree &T) {
if (T != NULL)
{
MidRTraverse(T->Lchild);
printf("%c", T->data);
MidRTraverse(T->Rchild);
}
}
//递归后序遍历该二叉链表树
void PostRTraverse (BiTree &T) {
if (T != NULL)
{
PostRTraverse(T->Lchild);
PostRTraverse(T->Rchild);
printf("%c", T->data);
}
}
完整代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//头文件包含部分
typedef struct BiLinkNode {
//二叉链表树节点的类型定义
char data;
struct BiLinkNode* Lchild;//链表指针域的左子树
struct BiLinkNode* Rchild;//链表指针域的右子树
} BiTNode, *BiTree;;
//先序遍历的顺序建立二叉链表
BiTree CreateBiLinkTree(BiTree &T) {
getchar();
char enter_number;
printf("请输入当前节点的值:");
scanf("%c", &enter_number);
if (enter_number == '#')
{
T = NULL;
}
else {
T = (BiTree)malloc(sizeof(BiTNode));
T->data = enter_number;
CreateBiLinkTree(T->Lchild);
printf("当前结点的值为空,输入另一个结点\n");
CreateBiLinkTree(T->Rchild);
}
return T;
}
//递归先序遍历该二叉链表树
void PreRTraverse (BiTree &T) {
if (T != NULL)
{
printf("%c", T->data);
PreRTraverse(T->Lchild);
PreRTraverse(T->Rchild);
}
}
//递归中序遍历该二叉链表树
void MidRTraverse (BiTree &T) {
if (T != NULL)
{
MidRTraverse(T->Lchild);
printf("%c", T->data);
MidRTraverse(T->Rchild);
}
}
//递归后序遍历该二叉链表树
void PostRTraverse (BiTree &T) {
if (T != NULL)
{
PostRTraverse(T->Lchild);
PostRTraverse(T->Rchild);
printf("%c", T->data);
}
}
//函数菜单
int main() {
bool isFlag = true;
BiTree T = NULL;
while (isFlag == true) {
printf("——————————二叉樹——————————————\n");
printf("\t\t1.創建二叉樹\n");
printf("\t\t2.先序遍历二叉链表树\n");
printf("\t\t3.中序遍历二叉链表树\n");
printf("\t\t4.后序遍历二叉链表树\n");
printf("\t\t5.退出\n");
printf("请选择功能功能:");
int choose;
scanf("%d", &choose);
switch (choose) {
case 1:
system("cls");
T = CreateBiLinkTree(T);
getchar();
break;
case 2:
printf("先序遍历二叉链表树的结果为:");
PreRTraverse(T);
printf("\n");
system("pause");
system("cls");
break;
case 3:
printf("中序遍历二叉链表树的结果为:");
MidRTraverse(T);
printf("\n");
system("pause");
system("cls");
break;
case 4:
printf("后序遍历二叉链表树的结果为:");
PostRTraverse(T);
printf("\n");
system("pause");
system("cls");
break;
case 5:
int choice;
printf("您是否要退出?(1/0)\n");
scanf("%d", &choice);
if (choice == 1)
{
isFlag = false;
}
break;
}
}
}
*@author:orsrrc
*CSDN:https://blog.csdn.net/qq_52321992?type=blog
* 博客园:https://www.cnblogs.com/orsrrc/
*/
注:本篇中涉及C++中的传递引用等方法,所以在创建源文件时文件后缀为.cpp,.cpp文件是向下兼容的,所以当我们使用C语言语句也可以编译成功。
由于使用VS编译时采用新的规则,原本的Scanf函数等不适用本规则会提示使用scanf_f函数或者_CRT_SECURE_NO_WARNINGS。这里我们使用_CRT_SECURE_NO_WARNINGS,方便阅读。如果你用的编译器不是VS的可以不在首行添加这一句
//先序遍历的顺序建立二叉链表
BiTree CreateBiLinkTree(BiTree &T) {
getchar();
char enter_number;
printf("请输入当前节点的值:");
scanf("%c", &enter_number);
if (enter_number == '#')//当输入的值为'#'时代表当前节点的值为空
{
T = NULL;
}
else {
T = (BiTree)malloc(sizeof(BiTNode));
T->data = enter_number;
CreateBiLinkTree(T->Lchild);
printf("当前结点的值为空,输入另一个结点\n");
CreateBiLinkTree(T->Rchild);
}
return T;
}
//递归先序遍历该二叉链表树
void PreRTraverse (BiTree &T) { /
if (T != NULL)
{
printf("%c", T->data);
PreRTraverse(T->Lchild);
PreRTraverse(T->Rchild);
}
}
//递归中序遍历该二叉链表树
void MidRTraverse (BiTree &T) {
if (T != NULL)
{
MidRTraverse(T->Lchild);
printf("%c", T->data);
MidRTraverse(T->Rchild);
}
}
//递归后序遍历该二叉链表树
void PostRTraverse (BiTree &T) {
if (T != NULL)
{
PostRTraverse(T->Lchild);
PostRTraverse(T->Rchild);
printf("%c", T->data);
}
}
完整代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//头文件包含部分
typedef struct BiLinkNode {
//二叉链表树节点的类型定义
char data;
struct BiLinkNode* Lchild;//链表指针域的左子树
struct BiLinkNode* Rchild;//链表指针域的右子树
} BiTNode, *BiTree;;
//先序遍历的顺序建立二叉链表
BiTree CreateBiLinkTree(BiTree &T) {
getchar();
char enter_number;
printf("请输入当前节点的值:");
scanf("%c", &enter_number);
if (enter_number == '#')
{
T = NULL;
}
else {
T = (BiTree)malloc(sizeof(BiTNode));
T->data = enter_number;
CreateBiLinkTree(T->Lchild);
printf("当前结点的值为空,输入另一个结点\n");
CreateBiLinkTree(T->Rchild);
}
return T;
}
//递归先序遍历该二叉链表树
void PreRTraverse (BiTree &T) {
if (T != NULL)
{
printf("%c", T->data);
PreRTraverse(T->Lchild);
PreRTraverse(T->Rchild);
}
}
//递归中序遍历该二叉链表树
void MidRTraverse (BiTree &T) {
if (T != NULL)
{
MidRTraverse(T->Lchild);
printf("%c", T->data);
MidRTraverse(T->Rchild);
}
}
//递归后序遍历该二叉链表树
void PostRTraverse (BiTree &T) {
if (T != NULL)
{
PostRTraverse(T->Lchild);
PostRTraverse(T->Rchild);
printf("%c", T->data);
}
}
//函数菜单
int main() {
bool isFlag = true;
BiTree T = NULL;
while (isFlag == true) {
printf("——————————二叉樹——————————————\n");
printf("\t\t1.創建二叉樹\n");
printf("\t\t2.先序遍历二叉链表树\n");
printf("\t\t3.中序遍历二叉链表树\n");
printf("\t\t4.后序遍历二叉链表树\n");
printf("\t\t5.退出\n");
printf("请选择功能功能:");
int choose;
scanf("%d", &choose);
switch (choose) {
case 1:
system("cls");
T = CreateBiLinkTree(T);
getchar();
break;
case 2:
printf("先序遍历二叉链表树的结果为:");
PreRTraverse(T);
printf("\n");
system("pause");
system("cls");
break;
case 3:
printf("中序遍历二叉链表树的结果为:");
MidRTraverse(T);
printf("\n");
system("pause");
system("cls");
break;
case 4:
printf("后序遍历二叉链表树的结果为:");
PostRTraverse(T);
printf("\n");
system("pause");
system("cls");
break;
case 5:
int choice;
printf("您是否要退出?(1/0)\n");
scanf("%d", &choice);
if (choice == 1)
{
isFlag = false;
}
break;
}
}
}
测试用代码ABC##DE#G##F###
欢迎留言与我交流!!!
本文来自博客园,作者:华岁渡春风,转载请注明原文链接:https://www.cnblogs.com/orsrrc/p/16182250.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本