C语言数据结构链式二叉树的创建、前序、中序、后序遍历

本文介绍了如何使用C语言创建链式二叉树,并详细讲解了二叉树的初始化以及如何进行前序、中序、后序遍历的操作。
摘要由CSDN通过智能技术生成

/*
*链式二叉树的创建
*二叉树的初始化
*前序 中序 后序遍历
*/

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1024
static int id=0;
typedef struct elementtype//数据结构体创建
{
    char name[MAXSIZE];
    int id;
}ElementType;
typedef struct treenode//节点结构体的创建
{
    ElementType data;
    struct treenode*left;//左节点
    struct treenode*right;//右节点
}TreeNode;
typedef struct binarytree//二叉链的结构体
{
    TreeNode *root;
     int length;//长度
     int depth;//深度
     int diameter;//从叶节点到叶节点的最长路径
}BinaryTree;
void init_binarytree(BinaryTree*tree);//二叉树的初始化
int  creat_binarytree(TreeNode*root);//二叉树的创建
void test_binarytree();//测试函数
void preordertrevers(TreeNode*node);//前序遍历
void inordertravers(TreeNode*node);//中序遍历
void postordertravers(TreeNode*node);//后序遍历
int main()
{
    test_binarytree();
    return 0;
}
void init_binarytree(BinaryTree*tree)//二叉树的初始化
{
    if(tree==NULL)
        return ;
    else
    {
        tree->depth=0;
        tree->diam
### 回答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语言二叉树链式创建以及前序中序和后序的遍历功能及主函数菜单的相关介绍。通过本文的学习可以了解链式存储二叉树创建方法,以及三种不同的遍历方式。同时,我们还可以巧妙的调用以上三种方法,并且使用主函数菜单以体现程序的易读性和操作性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值