二叉排序树(Binary Sort Tree)
参考文章:http://blog.csdn.net/ns_code/article/details/19823463
不过博主的使用第一种方法操作后的树已经不是二叉排序树了,值得深思!!
#include "stdio.h"
#include "stdlib.h" //二叉链表结点
typedef struct Node{
int data;
struct Node *lchild,*rchild;
}Node,*BSTree; /*
在指针pTree所指的二叉排序树中递归查找关键字为key的元素,
若查找成功,则返回ture,并将 查找到的数据对应的节点指针 保存在p中,
否则返回0,并将 查找路径上访问的最后一个节点指针 保存在p中。
这里的参数f指向每次递归遍历的子树的根节点的父节点,即始终是参数pTree的父节点,
它的初始值为NULL,其目的是跟踪查找路径上访问的当前节点的父节点(即上一个访问节点)
该函数用来被后面的插入结点函数调用。
*/
int search_Node(BSTree pTree,int key,BSTree f,BSTree &p)
{
if(!pTree){
p = f;
return ;
}else if(key == pTree->data){
p = pTree;
return ;
}else if(key > pTree->data){
search_Node(pTree->rchild,key,pTree,p);
}else{
search_Node(pTree->lchild,key,pTree,p);
} } /*
往二叉排序树种插入结点
当在pTree所指向的二叉排序树中查找不到关键字为key的数据元素时,
将其插入该二叉排序树,并返回1,否则返回0。
树空时插入会改变根节点的值,因此要传入引用。 */
int insertNode(BSTree &pTree,int key)
{
BSTree p;
if(!search_Node(pTree,key,NULL,p)){ BSTree pNew = (BSTree)malloc(sizeof(Node)); //产生新元素的结点
pNew->lchild = pNew->rchild = NULL;
pNew->data = key; if(!p){
pTree = pNew; //如何树空,直接将pNew置为根节点
}else{
if(key > p->data){
p->rchild = pNew; //作为右孩子插入p的右边
}else{
p->lchild = pNew; //作为左孩子插入p的左边
}
}
return ;
}else
return ; } //创建二叉排序树
BSTree create_BSTree(int *arr,int num)
{
BSTree pTree = NULL;
int i;
for(i=;i<num;i++)
insertNode(pTree,arr[i]);
return pTree; } //递归中序遍历二叉树,得到元素从小到大的有序排列
void InorderTraverse(BSTree pTree)
{
if(pTree){
InorderTraverse(pTree->lchild);
printf("%d ",pTree->data);
InorderTraverse(pTree->rchild);
}
} //修改左子树的方法删除结点
int delete_Node1(BSTree &p)
{
BSTree q,s;
if(!p->lchild){ //左子树为空,只需重新接上右子树
q = p;
p = p->rchild;
free(q);
}else if(!p->rchild){ //右子树为空,只需重新接上左子树
q = p;
p = p->lchild;
free(q);
}else{ //如果左右子树都不为空
//我们这里采取修改左子树的方法,也可以修改右子树,方法类似
q = p;
s = p->lchild; //取待删节点的左节点
while(s->rchild){ //一直向右,最终s为待删节点的前驱节点。
//如果将各节点元素按从小到大顺序排列成一个序列,
//则某节点的前驱节点即为序列中该节点的前面一个节点
q = s;
s = s->rchild;
}
//用s来替换待删节点p
p->data = s->data;
//根据情况,将s的左子树重接到q上
if(p != q){
q->rchild = s->lchild;
}else{
q->lchild = s->lchild;
}
free(s);
}
return ;
} //修改右子树的方法删除结点
int delete_Node2(BSTree &p)
{
BSTree q,s;
if(!p->lchild){ //左子树为空,只需重新接上右子树
q = p;
p = p->rchild;
free(q);
}else if(!p->rchild){ //右子树为空,只需重新接上左子树
q = p;
p = p->lchild;
free(q);
}else{
q = p;
s = p->rchild;
while(s->lchild){
q = s;
s = s->lchild;
}
//用s来替换待删节点p
p->data = s->data;
//根据情况,将s的左子树重接到q上
if(p != q){
q->lchild = s->rchild;
}else{
q->rchild = s->rchild;
}
free(s);
}
return ;
} //删除结点
int delete_BSTree(BSTree &pTree,int key)
{
if(!pTree){ //不存在关键字为key的结点
return ;
}else{
if(key == pTree->data){
// return delete_Node1(pTree);
return delete_Node2(pTree);
}else if(key > pTree->data){
return delete_BSTree(pTree->rchild,key);
}else{
return delete_BSTree(pTree->lchild,key);
}
}
} int main()
{
BSTree pTree;
int i,num,flag;
printf("请输入节点的个数:");
scanf("%d",&num);
// printf("%d\n",num); int *arr = (int *)malloc( num * sizeof(int));
for(i=;i<num;i++)
scanf("%d",arr+i); pTree = create_BSTree(arr,num);
printf("中序遍历该二叉排序树的结果:");
InorderTraverse(pTree);printf("\n"); printf("请输入要删除的结点:");
scanf("%d",&num);
flag = delete_BSTree(pTree,num);
if(flag){
printf("删除成功!\n");
}else{
printf("删除失败!\n");
}
printf("中序遍历该二叉排序树的结果:");
InorderTraverse(pTree);printf("\n"); return ;
}
敲敲代码有益身心,嘎嘎
参考书籍:《大话数据结构》
二叉排序树(Binary Sort Tree)的更多相关文章
- 二叉排序树(Binary Sort Tree)
1.定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ① 若它的左子树 ...
- 二叉查找树(Binary Sort Tree)(转)
二叉查找树(Binary Sort Tree) 我们之前所学到的列表,栈等都是一种线性的数据结构,今天我们将学习计算机中经常用到的一种非线性的数据结构--树(Tree),由于其存储的所有元素之间具有明 ...
- 算法学习记录-查找——二叉排序树(Binary Sort Tree)
二叉排序树 也称为 二叉查找数. 它具有以下性质: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值. 它的左.右子树也分别 ...
- PAT-1099(Build A Binary Search Tree)Java实现+二叉排序树的中序遍历和层次遍历
Build A Binary Search Tree PAT-1099 本题有意思的一个点就是:题目已经给出了一颗排序二叉树的结构,需要根据这个结构和中序遍历序列重构一棵二叉排序树. 解法:可以根据中 ...
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
[109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...
- Recover Binary Search Tree,恢复二叉排序树
问题描述:题意就是二叉树中有两个节点交换了,恢复结构. Two elements of a binary search tree (BST) are swapped by mistake. Recov ...
- 108. Convert Sorted Array to Binary Search Tree 109. Convert Sorted List to Binary Search Tree -- 将有序数组或有序链表转成平衡二叉排序树
108. Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascendin ...
- 99. Recover Binary Search Tree -- 找到二叉排序树中交换过位置的两个节点
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- PAT 甲级 1064 Complete Binary Search Tree (30 分)(不会做,重点复习,模拟中序遍历)
1064 Complete Binary Search Tree (30 分) A Binary Search Tree (BST) is recursively defined as a bin ...
随机推荐
- HTTP协议学习---(二)基本认证
什么是HTTP基本认证 桌面应用程序也通过HTTP协议跟Web服务器交互, 桌面应用程序一般不会使用cookie, 而是把 "用户名+冒号+密码"用BASE64编码的字符串放在ht ...
- Python开发最常犯错误总结10种
不管是在学习还是工作过程中,人都会犯错.虽然Python的语法简单.灵活,但也一样存在一些不小的坑,一不小心,初学者和资深Python程序员都有可能会栽跟头.本文是Toptal网站的程序员梳理的10大 ...
- 控件(进度类): RangeBase, Slider, ProgressBar, ProgressRing
1.RangeBase(基类) 的示例Controls/ProgressControl/RangeBaseDemo.xaml <Page x:Class="Windows10.Cont ...
- const、static、extern三个关键字
默认情况下,C语言的全局变量是全世界都可以访问的,也就是全局变量可以跨文件访问. extern可以引用全局变量 例如,如果有一个全局变量int money = 100;extern int money ...
- Struts2拦截器模拟
前言: 接触Struts2已经有一段时间,Student核心内容就是通过拦截器对接Action,实现View层的控制跳转.本文根据自身理解对Struts2进行一个Java实例的模拟,方便大家理解! 示 ...
- oracle触发器调用java程序
1.创建java程序:接收存储过程传递的参数,发送socket通信. create or replace and compilejava source named jym as import java ...
- .net读写config appsetting
读 this.txtOutPutPath.Text = ConfigurationManager.AppSettings["OutPutPath"]; this.txtFilter ...
- POJ1061 青蛙的约会
Description 两 只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它 们出发之前忘记了一件很重要 ...
- HTML/HTML5/CSS/CSS3教程速查手册地址以及如何快速直到webkit的用法
http://www.w3school.com.cn/ http://www.runoob.com/ 不过上面这两个都是标准的CSS和CSS3教程,针对一些类似-webkit-内核的样式没有公布. 下 ...
- PhpStorm PHP开发神器
链接:http://pan.baidu.com/s/1b4Vwjs 密码:c5uh