c语言二叉树链式创建以及前序,中序和后序的遍历功能,主函数菜单
时间: 2023-05-31 17:19:24 浏览: 151
### 回答1:
以下是C语言二叉树链式创建以及前序,中序和后序的遍历功能的代码,以及主函数菜单:
```
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct TreeNode {
int data; // 数据域
struct TreeNode *left; // 左子树指针
struct TreeNode *right; // 右子树指针
} TreeNode;
// 创建二叉树
TreeNode* createTree() {
int data;
scanf("%d", &data);
if (data == -1) { // 输入-1表示该节点为空
return NULL;
}
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode)); // 动态分配内存
node->data = data;
node->left = createTree(); // 递归创建左子树
node->right = createTree(); // 递归创建右子树
return node;
}
// 前序遍历
void preOrder(TreeNode *root) {
if (root == NULL) {
return;
}
printf("%d ", root->data); // 输出当前节点的数据
preOrder(root->left); // 递归遍历左子树
preOrder(root->right); // 递归遍历右子树
}
// 中序遍历
void inOrder(TreeNode *root) {
if (root == NULL) {
return;
}
inOrder(root->left); // 递归遍历左子树
printf("%d ", root->data); // 输出当前节点的数据
inOrder(root->right); // 递归遍历右子树
}
// 后序遍历
void postOrder(TreeNode *root) {
if (root == NULL) {
return;
}
postOrder(root->left); // 递归遍历左子树
postOrder(root->right); // 递归遍历右子树
printf("%d ", root->data); // 输出当前节点的数据
}
// 主函数菜单
int main() {
printf("请输入二叉树的节点数据,-1表示该节点为空:\n");
TreeNode *root = createTree(); // 创建二叉树
printf("前序遍历结果为:");
preOrder(root); // 前序遍历
printf("\n中序遍历结果为:");
inOrder(root); // 中序遍历
printf("\n后序遍历结果为:");
postOrder(root); // 后序遍历
printf("\n");
return ;
}
```
### 回答2:
C语言的二叉树是一种常见的数据结构,可以在对问题进行求解时提供很好的支持。在此,我们将介绍二叉树的链式存储结构以及前序,中序和后序的遍历功能,并在主函数中设置相应的菜单以实现用户交互的功能。
一、二叉树链式存储结构
二叉树链式存储结构一般由一个结构体表示,代表着二叉树中的每一个节点,具体代码如下:
```
struct TreeNode{
struct TreeNode *lchild;
struct TreeNode *rchild;
int value;
}
```
该结构体中包括左孩子指针、右孩子指针以及节点的值。
二、二叉树的创建
链式存储结构的二叉树创建通常使用递归函数来实现,例如下面这段代码:
```
struct TreeNode *createBinaryTree(){
int value;
struct TreeNode *node;
scanf("%d", &value);
if(value == -1){
node = NULL;
}else{
node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->value = value;
node->lchild = createBinaryTree();
node->rchild = createBinaryTree();
}
return node;
}
```
上面的代码通过递归函数实现了二叉树的创建,当输入的节点值为-1时,返回NULL,否则创建一个节点,并分别递归创建该节点的左右孩子。
三、二叉树的遍历
二叉树的遍历方式有三种:前序遍历、中序遍历和后序遍历。分别如下:
1.前序遍历:先根节点,再左孩子,最后右孩子
```
void preorder(struct TreeNode *root){
if(root != NULL){
printf("%d ", root->value);
preorder(root->lchild);
preorder(root->rchild);
}
}
```
在前序遍历中,我们先访问根节点,然后递归遍历左子树和右子树。
2.中序遍历:先左孩子,再根节点,最后右孩子
```
void inorder(struct TreeNode *root){
if(root != NULL){
inorder(root->lchild);
printf("%d ", root->value);
inorder(root->rchild);
}
}
```
在中序遍历中,我们先递归遍历左子树,然后访问根节点,最后递归遍历右子树。
3.后序遍历:先左孩子,再右孩子,最后根节点
```
void postorder(struct TreeNode *root){
if(root != NULL){
postorder(root->lchild);
postorder(root->rchild);
printf("%d ", root->value);
}
}
```
在后序遍历中,我们先递归遍历左子树,然后递归遍历右子树,最后访问根节点。
四、主函数菜单
接下来我们可以在主函数中实现一个简单的菜单功能,可以让用户选择创建二叉树并进行遍历操作。
```
int main(){
struct TreeNode *root;
int choice;
while(1){
printf("\n请选择操作:\n1、创建二叉树\n2、前序遍历\n3、中序遍历\n4、后序遍历\n0、退出程序\n");
scanf("%d", &choice);
switch(choice){
case 1:
printf("请输入二叉树节点的值,-1表示空节点:\n");
root = createBinaryTree();
break;
case 2:
printf("前序遍历结果为:");
preorder(root);
printf("\n");
break;
case 3:
printf("中序遍历结果为:");
inorder(root);
printf("\n");
break;
case 4:
printf("后序遍历结果为:");
postorder(root);
printf("\n");
break;
case 0:
printf("程序已退出...\n");
return 0;
default:
printf("输入有误,请重新输入!\n");
break;
}
}
}
```
在上述代码中,我们首先定义了一个包含循环的整型变量,用来实现菜单功能。具体来说,用户可以选择创建二叉树、前序遍历、中序遍历和后序遍历,或者退出程序。在此程序中,我们将createBinaryTree()函数返回的根节点赋值给root,然后用preorder()、inorder()和postorder()函数分别对该二叉树进行遍历,输出遍历结果。
综上所述,我们介绍了二叉树的链式存储结构以及前序,中序和后序的遍历方法,并在主函数中实现了一个简单的菜单功能,供用户进行交互操作。
### 回答3:
C语言中,二叉树是一种常见的数据结构,可以用链式存储方式来实现。链式存储方式即利用指针变量来存储二叉树中每个节点的父节点、左子节点和右子节点。本文将介绍如何使用链式存储方式创建二叉树,并实现前序、中序、后序遍历等基本功能,并且通过主函数菜单进行相应操作。
创建二叉树
首先,我们要创建一个二叉树,可以通过链式存储方式来实现,创建一个节点信息如下:
typedef struct BiTreeNode{
char data;
struct BiTreeNode *leftChild;
struct BiTreeNode *rightChild;
}BiTreeNode, *BiTree;
其中,data代表节点储存的数据,leftChild和rightChild分别代表该节点的左子节点和右子节点,采用指针的方式实现链式存储。
二叉树的创建可以采用递归的方式实现,具体过程如下:
//创建二叉树
BiTree createBiTree(){
BiTree T;
char c;
c = getchar(); //获取用户输入的字符
if(c == '#'){
T = NULL;
}else{
T = (BiTree)malloc(sizeof(BiTreeNode)); //为节点动态分配内存
T->data = c; //为节点赋值
T->leftChild = createBiTree(); //递归创建左子树
T->rightChild = createBiTree(); //递归创建右子树
}
return T;
}
在createBiTree()函数中,从用户输入中获取字符c。如果c等于‘#’,则表示当前节点为NULL,返回NULL。否则,为当前节点T动态分配内存,并将用户输入的字符赋值给T的data。接着,递归建立T的左子树和右子树。最后,返回节点T。
前序遍历
前序遍历是指从二叉树的根节点开始,先访问该节点,再先序遍历该节点的左子树,最后再前序遍历该节点的右子树。
void preOrderTraverse(BiTree T){
if(T){
printf("%c", T->data); //访问该节点
preOrderTraverse(T->leftChild); //前序遍历左子树
preOrderTraverse(T->rightChild); //前序遍历右子树
}
}
在preOrderTraverse()函数中,如果节点T存在,则打印该节点的数据。接着,递归前序遍历T的左子树和右子树。
中序遍历
中序遍历是指从二叉树的根节点开始,先中序遍历该节点的左子树,再访问该节点,最后再中序遍历该节点的右子树。
void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->leftChild); //中序遍历左子树
printf("%c", T->data); //访问该节点
InOrderTraverse(T->rightChild); //中序遍历右子树
}
}
在InOrderTraverse()函数中,如果节点T存在,则递归中序遍历T的左子树。接着,打印该节点的数据。最后,递归中序遍历T的右子树。
后序遍历
后序遍历是指从二叉树的根节点开始,先后序遍历该节点的左子树,再后序遍历该节点的右子树,最后访问该节点。
void PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T->leftChild); //后序遍历左子树
PostOrderTraverse(T->rightChild); //后序遍历右子树
printf("%c", T->data); //访问该节点
}
}
在PostOrderTraverse()函数中,如果节点T存在,则递归后序遍历T的左子树和右子树。接着,打印该节点的数据。
主函数菜单
在实现了二叉树的创建和遍历功能后,我们可以在主函数中展示一个菜单,供用户进行相应的操作。
int main(){
BiTree T = NULL;
printf("Please input the data of node in the binary tree.(# represent NULL):\n");
T = createBiTree(); //创建二叉树
printf("\nThe result of pre-order traversal is:\n");
preOrderTraverse(T); //前序遍历二叉树
printf("\nThe result of in-order traversal is:\n");
InOrderTraverse(T); //中序遍历二叉树
printf("\nThe result of post-order traverse is:\n");
PostOrderTraverse(T); //后序遍历二叉树
return 0;
}
在主函数中,首先声明T,并提示用户输入节点信息。创建二叉树后,打印前序遍历、中序遍历和后序遍历的结果。
以上是关于C语言二叉树链式创建以及前序,中序和后序的遍历功能及主函数菜单的相关介绍。通过本文的学习可以了解链式存储的二叉树创建方法,以及三种不同的遍历方式。同时,我们还可以巧妙的调用以上三种方法,并且使用主函数菜单以体现程序的易读性和操作性。
阅读全文