数据结构实验之二叉树【内容丰富&常规题及思考题代码】

一、实验目的

1)理解二叉树的定义和二叉树的5大性质,并掌握它们的推理过程。
2)熟练掌握二叉树的两种存储方式:顺序和(静态)链式。
3)熟练掌握二叉树的ADT、存储结构和处理方法,理解遍历的实质,能够用递归和非递归的方法实现二叉树的三种遍历。
4)在掌握二叉树的各种基础的操作后,能够利用二叉树的相关知识解决一些相关的算法思维题。

二、实验环境

1)自备计算机,windows操作系统以及相关的编译器(如devc++)。

三、实验要求

1)采用二叉链表作为存储结构,实现二叉树的(先序、中序、后序)遍历,其中,先序遍历和后序遍历采用递归算法,中序遍历采用非递归算法。
2)树中的每个节点的类型定义为字符型。

四、实验内容

代码如下:
1)非递归二叉链表实现中序遍历
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2)二叉链表递归实现三种遍历
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

五、思考题

代码如下:
2)对二叉树中序线索化的实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3)树的层次遍历:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4)已知树的先序和中序遍历,求其后序遍历:
在这里插入图片描述
在这里插入图片描述

六、运行结果

在这里插入图片描述

七、总结

通过这次试验,我更加熟悉了树这一非线性数据结构,更加熟练地掌握二叉树的ADT、存储结构和处理方法。理解了遍历的实质,能够用递归和非递归的方法,用二叉链表实现二叉树的三种遍历。学会了树的层次遍历和线索化二叉树的使用。此外,通过学习、思考和代码调试,我能够利用二叉树的相关知识(权值。bfs、广度、深度)来解决一些相关的算法思维题。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我可以提供一份二叉树实验代码的示例,供你参考。以下是一个简单的二叉树实现,包括节点的结构体定义、创建、遍历、插入和删除操作等。 ``` #include <stdio.h> #include <stdlib.h> // 二叉树节点结构体定义 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 创建二叉树 TreeNode *createTree() { TreeNode *root = NULL; int val; printf("请输入二叉树的根节点值:"); scanf("%d", &val); if (val == -1) { // 输入-1表示结束 return NULL; } root = (TreeNode *)malloc(sizeof(TreeNode)); root->val = val; root->left = createTree(); // 递归创建左子树 root->right = createTree(); // 递归创建右子树 return root; } // 前序遍历二叉树 void preorderTraversal(TreeNode *root) { if (root == NULL) { return; } printf("%d ", root->val); preorderTraversal(root->left); preorderTraversal(root->right); } // 中序遍历二叉树 void inorderTraversal(TreeNode *root) { if (root == NULL) { return; } inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal(root->right); } // 后序遍历二叉树 void postorderTraversal(TreeNode *root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->val); } // 插入节点 void insertNode(TreeNode *root, int val) { if (root == NULL) { return; } if (val < root->val) { // 插入左子树 if (root->left == NULL) { TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; root->left = node; } else { insertNode(root->left, val); } } else { // 插入右子树 if (root->right == NULL) { TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; root->right = node; } else { insertNode(root->right, val); } } } // 删除节点 TreeNode *deleteNode(TreeNode *root, int val) { if (root == NULL) { return NULL; } if (val < root->val) { // 在左子树中删除 root->left = deleteNode(root->left, val); } else if (val > root->val) { // 在右子树中删除 root->right = deleteNode(root->right, val); } else { // 找到了要删除的节点 if (root->left == NULL) { // 只有右子树 TreeNode *temp = root->right; free(root); return temp; } else if (root->right == NULL) { // 只有左子树 TreeNode *temp = root->left; free(root); return temp; } else { // 左右子树都存在 TreeNode *temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->val = temp->val; root->right = deleteNode(root->right, temp->val); } } return root; } // 主函数 int main() { TreeNode *root = NULL; int val; root = createTree(); // 创建二叉树 printf("前序遍历:"); preorderTraversal(root); // 前序遍历 printf("\n中序遍历:"); inorderTraversal(root); // 中序遍历 printf("\n后序遍历:"); postorderTraversal(root); // 后序遍历 printf("\n请输入要插入的节点值:"); scanf("%d", &val); insertNode(root, val); // 插入节点 printf("插入后的中序遍历:"); inorderTraversal(root); // 中序遍历 printf("\n请输入要删除的节点值:"); scanf("%d", &val); root = deleteNode(root, val); // 删除节点 printf("删除后的中序遍历:"); inorderTraversal(root); // 中序遍历 return 0; } ``` 以上是一个简单的二叉树实现示例,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米莱虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值