使用C语言实现结点值为字母的完全二叉树的插入、3种遍历和删除操做和实验报告

时间: 2023-11-22 19:54:31 浏览: 32
实验目的: 1.掌握完全二叉树的插入、遍历和删除操作。 2.深入理解C语言中指针的概念和运用。 实验原理: 完全二叉树:一棵深度为k的,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中编号从1至n的节点一一对应时,称之为完全二叉树。 完全二叉树的性质: 1.除了最后一层,其他层节点数都是满的。 2.最后一层节点都是靠左排列的。 插入操作: 在完全二叉树中,新节点插入到最后一层的最右边。 1.如果树为空,则插入的节点为根节点。 2.如果树不为空: a.找到最后一层的最右边节点。 b.插入新的节点。 c.如果插入后,该层节点数已满,则新开一层。 遍历操作: 1.前序遍历:先访问根节点,再依次遍历左子树和右子树。 2.中序遍历:先遍历左子树,再访问根节点,最后遍历右子树。 3.后序遍历:先遍历左子树,再遍历右子树,最后访问根节点。 删除操作: 1.如果要删除的节点没有子节点,直接删除。 2.如果要删除的节点只有一个子节点,则将该子节点代替要删除的节点。 3.如果要删除的节点有两个子节点,则在其右子树中找到最小的节点,并将其代替要删除的节点。 实验步骤: 1.定义完全二叉树的节点结构体: ``` typedef struct TreeNode{ char data; struct TreeNode *lchild; //左孩子 struct TreeNode *rchild; //右孩子 }TreeNode, *Tree; ``` 2.定义完全二叉树的插入函数: ``` void InsertNode(Tree *root, char data){ TreeNode *new_node = (TreeNode*)malloc(sizeof(TreeNode)); new_node->data = data; new_node->lchild = NULL; new_node->rchild = NULL; if((*root) == NULL){ (*root) = new_node; return; } TreeNode *p = (*root); int count = 0; while(p->lchild != NULL){ count++; if(count & 1){ //如果count为奇数,则向左子树查找 p = p->lchild; } else{ //如果count为偶数,则向右子树查找 p = p->rchild; } } if(count & 1){ //如果count为奇数,则新节点插入到左子树 p->lchild = new_node; } else{ //如果count为偶数,则新节点插入到右子树 p->rchild = new_node; } } ``` 3.定义完全二叉树的前序遍历函数: ``` void PreOrderTraversal(Tree root){ if(root != NULL){ printf("%c ", root->data); PreOrderTraversal(root->lchild); PreOrderTraversal(root->rchild); } } ``` 4.定义完全二叉树的中序遍历函数: ``` void InOrderTraversal(Tree root){ if(root != NULL){ InOrderTraversal(root->lchild); printf("%c ", root->data); InOrderTraversal(root->rchild); } } ``` 5.定义完全二叉树的后序遍历函数: ``` void PostOrderTraversal(Tree root){ if(root != NULL){ PostOrderTraversal(root->lchild); PostOrderTraversal(root->rchild); printf("%c ", root->data); } } ``` 6.定义完全二叉树的查找节点函数: ``` TreeNode* FindNode(Tree root, char data){ if(root == NULL){ return NULL; } if(root->data == data){ return root; } TreeNode *p = FindNode(root->lchild, data); if(p != NULL){ return p; } else{ return FindNode(root->rchild, data); } } ``` 7.定义完全二叉树的删除节点函数: ``` void DeleteNode(Tree *root, char data){ TreeNode *p = FindNode((*root), data); if(p == NULL){ return; } if(p->lchild == NULL && p->rchild == NULL){ //要删除的节点没有子节点 free(p); p = NULL; return; } if(p->lchild == NULL || p->rchild == NULL){ //要删除的节点只有一个子节点 TreeNode *child = p->lchild ? p->lchild : p->rchild; p->data = child->data; p->lchild = child->lchild; p->rchild = child->rchild; free(child); child = NULL; return; } else{ //要删除的节点有两个子节点 TreeNode *q = p->rchild; while(q->lchild != NULL){ //在右子树中找到最小的节点 q = q->lchild; } p->data = q->data; //将最小的节点代替要删除的节点 DeleteNode(&(p->rchild), q->data); //删除最小的节点 return; } } ``` 实验报告: 本次实验实现了结点值为字母的完全二叉树的插入、3种遍历和删除操作,并且深入理解了C语言中指针的概念和运用。 在插入操作中,采用了层次遍历的方法,找到最后一层的最右边节点,然后插入新的节点。如果插入后,该层节点数已满,则新开一层。 在遍历操作中,分别实现了前序遍历、中序遍历和后序遍历三种方法。其中,前序遍历先访问根节点,再依次遍历左子树和右子树;中序遍历先遍历左子树,再访问根节点,最后遍历右子树;后序遍历先遍历左子树,再遍历右子树,最后访问根节点。 在删除操作中,分为三种情况:要删除的节点没有子节点、要删除的节点只有一个子节点和要删除的节点有两个子节点。对于第一种情况,直接删除节点;对于第二种情况,将子节点代替要删除的节点;对于第三种情况,在其右子树中找到最小的节点,并将其代替要删除的节点。 综上所述,本次实验使我更深入理解了完全二叉树的相关知识,同时也掌握了C语言中指针的概念和运用,提高了我的编程能力。

相关推荐

最新推荐

recommend-type

用递归和非递归算法实现二叉树的三种遍历

有测试结果 (一) 从键盘输入二叉树的扩展先序遍历序列,建立二叉树的二叉链表存储结构; (二) 分别用递归和非递归算法实现二叉树的三种遍历;
recommend-type

C语言中计算二叉树的宽度的两种方式

主要介绍了C语言中计算二叉树的宽度的两种方式的相关资料,需要的朋友可以参考下
recommend-type

通过先序遍历和中序遍历后的序列还原二叉树(实现方法)

下面小编就为大家带来一篇通过先序遍历和中序遍历后的序列还原二叉树(实现方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

数据结构c语言版建立二叉树,中序非递归遍历(实验报告)

编写程序,用先序递归的方法建立二叉树,建立二叉树后,用中序非递归方法遍历该二叉树,并输出遍历序列。
recommend-type

数据结构综合课设二叉树的建立与遍历.docx

1.问题描述: 建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。 2.基本要求: 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立...采用非递归算法实现二叉树遍历。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。