/*
*@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###
欢迎留言与我交流!!!