二叉树删除算法.doc_第1页
二叉树删除算法.doc_第2页
二叉树删除算法.doc_第3页
二叉树删除算法.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

二叉树删除算法姓名:李晓娜 学号:20122593 班级:软件一班1、 问题描述使用算法实现二叉树的建立及删除。2、 解题思路二叉树的删除操作比较复杂,主要分三种情况:1、删除没有子节点的节点,2、删除只有一个节点的节点(其中有分为两种情况),3、删除有两个节点的节点。首先看第一种情况:(删除没有子节点的节点) 删除没有子节点的节点只需要将被删除节点的父节点指向空即可第二种情况:(删除只有一个子节点的节点) 删除有一个子节点的节点,只需要将被删除节点的父节点指向删除节点的子节点即可第三种情况:(删除有两个子节点的节点,即左右子树都非空) 删除有两个子节点的节点,到底谁来替代被删除的节点的位置呢?是左节点,还是右节点,代替以后这个子节点的子节点应该怎么安排?一系列的问题都出来了。简便的方法就是要找一个节点代替这个被删除的节点,这就要从二叉搜索树的定义来看。因为二叉搜索树是有序的,我们要找的节点在这棵树上,而且这个节点要比被删除的左节点大,比右节点小。先看看这个已被删除节点的右节点为根的子树的所有节点的值都要比被删除节点大,这是二叉搜索树定义的,但是要在这个集合中找到最小的一个,来代替被删除的节点,那就要在这棵子树上一直往左找。这个节点比被删除的节点的右节点小,且比左节点大,那这个节点就叫做被删除节点的后继节点,用这个节点来代替被删除节点。3、 实验代码#include #include typedef int InfoType;typedef int KeyType;/假定关键字类型为整数typedef struct node/结点类型 KeyType key;/关键字项InfoType otherinfo;/其它数据域,InfoType视应用情况而定 下面不处理它struct node *lchild,*rchild;/左右孩子指针BSTNode;typedef BSTNode *BSTree;/BSTree是二叉排序树的类型void main()void InsertBST(BSTree *Tptr,KeyType key);BSTree CreateBST(void);void DelBSTNode(BSTree *Tptr,KeyType key);void ListBinTree(BSTree T);/用广义表表示二叉树BSTree T;int key;printf(请输入关键字(输入0为结束标志):n);T=CreateBST();ListBinTree(T);printf(n);printf(请输入欲删除关键字:);scanf(%d,&key);DelBSTNode(&T,key);ListBinTree(T);printf(n);void InsertBST(BSTree *Tptr,KeyType key)/若二叉排序树*Tptr中没有关键字为key,则插入,否则直接返回BSTNode *f,*p=*Tptr;/p的初值指向根结点while(p)/查找插入位置if(p-key=key) return;/树中已有key,无须插入f=p;/f保存当前查找的结点p=(keykey)? p-lchild:p-rchild;/若keykey,则在左子树中查找,否则在右子树中查找p=(BSTNode *)malloc(sizeof(BSTNode);p-key=key;p-lchild=p-rchild=NULL;/生成新结点if(*Tptr=NULL)/原树为空*Tptr=p;/新插入的结点为新的根else/原树非空时将新结点*p作为*f的左孩子或右孩子插入if(keykey)f-lchild=p;else f-rchild=p;BSTree CreateBST(void)/输入一个结点序列,建立一棵二叉排序树,将根结点指针返回BSTree T=NULL;/初始时T为空树KeyType key;scanf(%d,&key);/读入一个关键字while(key)/假设key=0是输入结束标志InsertBST(&T,key);/将key插入二叉排序树Tscanf(%d,&key);/读入下一关键字return T;/返回建立的二叉排序树的根指针void DelBSTNode(BSTree *Tptr,KeyType key)/在二叉排序树*Tptr中删去关键字为key的结点BSTNode *parent=NULL,*p=*Tptr,*q,*child;while(p)/从根开始查找关键字为key的待删结点if(p-key=key) break;/已找到,跳出查找循环parent=p;/parent指向*p的双亲p=(keykey)?p-lchild:p-rchild;/parent指向*p的左或右子树中继续找if(!p) return;/找不到被删结点则返回q=p;/q记住被删结点*pif(q-lchild & q-rchild)/*q的两个孩子均非空,故找*q的中序后继*pfor(parent=q,p=q-rchild; p-lchild; parent=p,p=p-lchild);/现在情况(3)已被转换为情况(2),而情况(1)相当于是情况(2)中child=NULL状况child=(p-lchild)? p-lchild:p-rchild;/若是情况(2),则child非空;否则child为空if(!parent)/*p的双亲为空,说明*p为根,删*p后应修改根指针*Tptr=child;/若是情况(1),则删去*p后,树为空;否则child变为根else /*p不是根,将*p的孩子和*p的双亲进行连接,*p从树上被摘下if(p=parent-lchild)/*p是双亲的左孩子parent-lchild=child;/*child作为*parent的左孩子else parent-rchild=child;/*child作为*parent的右孩子if(p!=q)/是情况(3),需将*p的数据复制到*qq-key=p-key;/若还有其它数据域亦需复制free(p);/释放*p占用的空间void ListBinTree(BSTree T)/用广义表表示二叉树 if (T!=NULL) printf(%d,T-key);if (T-lchild!=NULL|T-rchild!=NULL) printf();ListBinTree(T-lchild);if (T-rchild!=NULL) pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论