#include <IOSTREAM.H>
#include <STDLIB.H>
//二叉树的生成和释放
typedef struct Node
{int data;struct Node * pParent;struct Node * pLeftChild;struct Node * pRightChild;
}Node;Node * Create_BTree(int *array,Node* pParent=NULL)//二叉排序树的创建,按照先序遍历的方法进行构造
{static int i=0;if (array[i]==0){return NULL;}Node *temp=(Node *)malloc(sizeof(Node));temp->data=array[i];temp->pParent=pParent;i++;temp->pLeftChild=Create_BTree(array,temp);i++;temp->pRightChild=Create_BTree(array,temp);return temp;
}
void Mid_Order(Node* tree)//二叉排序树的中序遍历
{if (tree==NULL){return;}Mid_Order(tree->pLeftChild);cout<<tree->data<<" ";Mid_Order(tree->pRightChild);
}
void Destroy_BTree(Node* tree)//二叉排序树的是否
{if (tree==NULL){return;}Destroy_BTree(tree->pLeftChild);Destroy_BTree(tree->pRightChild);free(tree);
}
Node* Tree_Search(Node* tree,int x)//二叉排序树的查找
{Node* temp=tree;while(temp){if(temp->data==x)break;else if(temp->data>x)temp=temp->pLeftChild;elsetemp=temp->pRightChild;}return temp;
}
Node * Tree_Minimum(Node* tree)//二叉排序树的最小节点
{while(tree&&tree->pLeftChild){tree=tree->pLeftChild;}return tree;
}
Node * Tree_Maximum(Node* tree)//二叉排序树的最大节点
{while(tree&&tree->pRightChild){tree=tree->pRightChild;}return tree;
}
Node * Tree_Successor(Node *p)//返回节点p的后继//中序遍历
{if(p==NULL)return p;else if(p->pRightChild)return Tree_Minimum(p->pRightChild);else{while(p->pParent&&p->pParent->pRightChild==p)p=p->pParent;return p->pParent;}}
Node *Tree_PreDecessor(Node* p)//中序遍历 求p的前驱节点
{if (p==NULL)return p;else if(p->pLeftChild)return Tree_Maximum(p->pLeftChild);else{while(p->pParent&&p->pParent->pLeftChild==p)p=p->pParent;return p->pParent;}
}
void  Tree_Insert(Node* &tree,int x)//给二叉排序树插入新节点
{Node * pNodeNew=(Node*)malloc(sizeof(Node));pNodeNew->pLeftChild=NULL;pNodeNew->pRightChild=NULL;pNodeNew->data=x;if(tree==NULL){pNodeNew->pParent=NULL;tree=pNodeNew;return;}Node * pTempParent=NULL,*pTemp=tree;while(pTemp){pTempParent=pTemp;if (pTemp->data<x){pTemp=pTemp->pRightChild;} else{pTemp=pTemp->pLeftChild;}}pNodeNew->pParent=pTempParent;if (pTempParent->data<x){pTempParent->pRightChild=pNodeNew;}elsepTempParent->pLeftChild=pNodeNew;
}
void Tree_Delete(Node* &tree,Node *p)//删除二叉排序树中一个节点
{if(p->pLeftChild==NULL&&p->pRightChild==NULL)//删除叶节点
    {Node *pParent=p->pParent;if (pParent){if (pParent->data<p->data){pParent->pRightChild=NULL;}elsepParent->pLeftChild=NULL;free(p);} else{tree=NULL;free(p);}}else if (p->pLeftChild&&p->pRightChild==NULL||p->pRightChild&&p->pLeftChild==NULL)//只有一个子树
    {Node *pParent=p->pParent;if (pParent){if (pParent->data<p->data)//子树连到父节点的右孩子
            {if(p->pLeftChild)//哪个子树不为空连哪个
                {pParent->pRightChild=p->pLeftChild;p->pLeftChild->pParent=pParent;}else{pParent->pRightChild=p->pRightChild;p->pRightChild->pParent=pParent;}free(p);}else{if(p->pLeftChild)//哪个子树不为空连哪个
                {pParent->pLeftChild=p->pLeftChild;p->pLeftChild->pParent=pParent;}else{pParent->pLeftChild=p->pRightChild;p->pRightChild->pParent=pParent;}free(p);    }} else{if(p->pLeftChild){p->pLeftChild->pParent=NULL;tree=p->pLeftChild;}else{p->pRightChild->pParent=NULL;tree=p->pRightChild;}free(p);}}else//有两个子树
    {Node *temp=Tree_Maximum(p->pLeftChild);int x=p->data;p->data=temp->data;temp->data=x;Tree_Delete(tree,temp);}
}
void main()
{int array[]={15,6,3,2,0,0,4,0,0,7,0,13,9,0,0,0,18,17,0,0,20,0,0};Node *tree=Create_BTree(array);Tree_Insert(tree,21);Mid_Order(tree);cout<<endl;Node *temp=Tree_Search(tree,7);//查找
    Tree_Delete(tree,temp);Mid_Order(tree);cout<<endl;Destroy_BTree(tree);
}

转载于:https://www.cnblogs.com/GoAhead/archive/2012/10/26/2741508.html

二叉排序树的相关操作相关推荐

  1. c语言程序构造二叉排序树,C语言实现二叉排序树的相关操作

    本文链接: 二叉排序树(Binary Sort Tree)c语言 二叉排序树,又称为二叉查找树.它或则是一颗空树,或者是带有以下性质的二叉树: 构造二叉排序树的目的,并不是为了顺序,而是为了提升查找和 ...

  2. 数据结构源码笔记(C语言):二叉平衡树的相关操作算法

    //二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...

  3. 2021年大数据HBase(五):HBase的相关操作JavaAPI方式

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-JavaAPI方式 一.需求说明 ...

  4. 2021年大数据HBase(四):HBase的相关操作-客户端命令式!【建议收藏】

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-客户端命令式 1.进入HBase ...

  5. 2021年大数据Spark(二十五):SparkSQL的RDD、DF、DS相关操作

      目录 RDD.DF.DS相关操作 SparkSQL初体验 SparkSession 应用入口 获取DataFrame/DataSet 使用样例类 指定类型+列名 自定义Schema ​​​​​​​ ...

  6. 【数据结构】二叉树及其相关操作

    二叉树的定义 二叉树是一个由结点构成的有限集合,这个集合或者为空,或者由一个根节点及两棵互不相交的分别称作这个根节点的左子树和右子树的二叉树组成. 二叉树并非一般的树形结构的特殊形式,它们是两种不同的 ...

  7. Linux之用户组相关操作 groupadd groupdel

    Linux之用户组相关操作  groupadd  groupdel 1. 创建用户组 命令 说明 groupadd 创建(添加)用户组 创建用户组效果图: [grep是搜索功能,详情博文:https: ...

  8. Linux之用户相关操作

    Linux之用户相关操作 1. 创建用户  [创建后会立即让设置密码] 命令 说明 useradd 创建(添加)用户 useradd命令选项: 选项 说明 -m 自动创建用户主目录,主目录的名字就是用 ...

  9. java导入包大全_eclipse快速导入jar包的相关操作步骤

    eclipse怎样快速导入jar包呢?熟悉这款软件是非常简单的,今天小编就分享了关于eclipse快速导入jar包,有需要的朋友一起来看看吧! eclipse快速导入jar包的相关操作步骤 方法1·最 ...

最新文章

  1. angular父组件通过@ViewChild 主动获取子组 件的数据和方法
  2. C++ 虚函数和纯虚函数
  3. Java实现简易的文件的迁移器
  4. linux系统启动流程及常见问题的解决
  5. Kotlin静态方法定义和调用
  6. 音频分析工具:zplane de​​​​​​​Coda for Mac
  7. HTML5期末大作业:关于旅游主题网站设计——开心网旅游网页源码(15页) HTML+CSS+JavaScript
  8. arm解锁 j-flash_jlink驱动下载(SEGGER J-FlASH ARM)
  9. 【打印机】连接共享打印机找不到网络路径解决方案
  10. “大数据杀熟”将被明令禁止:亚马逊才是大数据杀熟算法的鼻祖
  11. 程序员养生-人体白发的机制及治疗、调养恢复
  12. nuc8i5beh安装黑苹果的安装教程,接近完美运行
  13. nums和nums[:]
  14. 【Java+MySQL】随机添加测试数据栗子
  15. UML画图总结以及浅谈UNL九种图
  16. java读取qq邮箱邮件
  17. 时辰和属相、当令经的对应关系
  18. zsh:command not found:conda的解决方法
  19. android 代码审核 同质化,李相国:Android同质化竞争以差异制胜
  20. 对“端到端”原则的理解

热门文章

  1. java之gui索引窗口_老白的JAVA课程14 GUI 窗口的设置
  2. 紘康单片机_紘康HY11P14 - SOC芯片 - 产品展示 - SOC芯片_IC芯片pcba开发_深圳市联泰威电子有限公司...
  3. confirm自定义按钮文字_公众号涨粉神器——自定义菜单,互动运营更灵活!
  4. android 创建资源别名,android – 将具有相同名称的布局资源别名化为不同的屏幕限定符...
  5. python升级知识整理 第五节:文件整理
  6. C语言实现SHA-1
  7. Linux gcc 制作动/静态链接库
  8. 2021 年第十一届 MathorCup 高校数学建模挑战赛A题分析
  9. c++ std::priority_queue优先队列
  10. OpenGL函数功能glutTimerFunc()