二叉树的删除

实验目的:

通过本次实验,掌握二叉树递归处理算法,并会分析该算法的时间复杂度。

实验环境:

硬件:PC机
软件:windows操作系统,C语言

实验内容:

删除二叉树的子树:假设二叉树中的结点均不相等,采用二叉链存储,设计递归算法删除根结点值为x的子树。

实验过程:

1.算法设计

二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树都是二叉树。左子树和右子树是有顺序的,二叉树是有序树。
二叉链存储:用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。
如果要删除结点值为x的子树,则首先需要查找到值为x的结点,其左子树上的元素都小于树根,右子树上的元素都大于树根,所有的子树也满足这个性质。
找到x结点之后要分析情况,该结点是叶结点,即两端没有结点,没有子树,左右结点为null。该结点只有一端结点,左结点为空或者右结点为空,这样只需要把左结点或者右结点删除即可。该结点是完整的,左右子树都不为空,即两端结点都有值,就需要把左右子树都删除。
CreateBiTree:创建一棵二叉树
Release:删除目标结点X及其子树
SeDelete_X:寻找目标结点X
FirstTraver:先序遍历二叉树

2.程序清单

//建立一颗二叉树

#include<stdio.h>
#include <stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild; //定义左右孩子的指针
}BiTNode,*BiTree;

void Release(BiTree &T){ //递归删除目标结点以及其子树
if(T!=NULL){
Release(T->lchild);
Release(T->rchild);
free(T);
T=NULL;
}
}

// 递归寻找目标结点

void SeDelete_X(BiTree &T,char x){
if(T==NULL) //先判断是否为空
return;

if(T->data==x){       //当T的值和X一样时即找到了目标结点
		Release(T);   
}
if(T!=NULL){		 //该结点不是目标结点,则递归向左右孩子寻找目标结点 
	SeDelete_X(T->lchild, x);
	SeDelete_X(T->rchild, x);
}

}

// 先序方法建立一颗二叉树

void CreateBiTree(BiTree &T){
char ch;
scanf(“%c”,&ch);
if(ch==‘#’) T=NULL; //#表示此结点为空
else
{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}

//先序遍历二叉树

void FirstTraver(BiTree T){
if(T){
printf(“%c”,T->data);
FirstTraver(T->lchild);
FirstTraver(T->rchild);
}
}

//主函数

int main()
{
BiTree T;
printf(“请建立表:\n”);
CreateBiTree(T); //建立二叉树
char ch;
ch=getchar();
// BiTree K=T;
FirstTraver(T); //先序遍历输出二叉树
printf(“\n”);
printf(“请输入要删除的节点:\n”);
char del;
scanf(“%c”,&del);
SeDelete_X(T,del); // 删除目标结点及其子树
FirstTraver(T); //删除之后再次先序遍历删除后的结果

}

3.运行结果

在这里插入图片描述

4.实验总结:

通过这次课程设计的程序实践,我实在获益匪浅!这次的程序设计对我来说无疑是一个具大的考验,课下我就一直为实现程序而努力,翻阅相关书籍、在网上查找资料。因为开始时基础不是很好,过程中遇到了不少的阻碍,编写程序的进度也比较慢。但是通过努力,我对这次实验的原理有了一定的理解,终于写出了本次课程设计的核心算法,并使其能够正常的运行。
这次的设计工作,让我体会到了作为一个编程人员的艰难,一个算法到具体实现,再到应用层面的开发是需要有一段较长的路要走的,不是一朝一夕就可以实现的,而且在编好程序后,编程人员还要花很多的时间去完善它,其中的辛苦,很难用言语表达出来。今后,我会更加努力的学习专业知识,努力提高自我的能力。同时,也非常感谢老师上课讲授的知识!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值