参考文章: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)的更多相关文章

  1. 二叉排序树(Binary Sort Tree)

    1.定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ①  若它的左子树 ...

  2. 二叉查找树(Binary Sort Tree)(转)

    二叉查找树(Binary Sort Tree) 我们之前所学到的列表,栈等都是一种线性的数据结构,今天我们将学习计算机中经常用到的一种非线性的数据结构--树(Tree),由于其存储的所有元素之间具有明 ...

  3. 算法学习记录-查找——二叉排序树(Binary Sort Tree)

    二叉排序树 也称为 二叉查找数. 它具有以下性质: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值. 它的左.右子树也分别 ...

  4. PAT-1099(Build A Binary Search Tree)Java实现+二叉排序树的中序遍历和层次遍历

    Build A Binary Search Tree PAT-1099 本题有意思的一个点就是:题目已经给出了一颗排序二叉树的结构,需要根据这个结构和中序遍历序列重构一棵二叉排序树. 解法:可以根据中 ...

  5. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】

    [109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...

  6. Recover Binary Search Tree,恢复二叉排序树

    问题描述:题意就是二叉树中有两个节点交换了,恢复结构. Two elements of a binary search tree (BST) are swapped by mistake. Recov ...

  7. 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 ...

  8. 99. Recover Binary Search Tree -- 找到二叉排序树中交换过位置的两个节点

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  9. PAT 甲级 1064 Complete Binary Search Tree (30 分)(不会做,重点复习,模拟中序遍历)

    1064 Complete Binary Search Tree (30 分)   A Binary Search Tree (BST) is recursively defined as a bin ...

随机推荐

  1. C# for循环及循环嵌套

    格式(for循环四要素:初始条件.循环条件.循环体.状态改变) for (int i=1<初始条件>;i<=n<循环条件>;i++<状态改变>) { < ...

  2. SPAN的高度问题

    FIRST OF ALL,最容易令人忽略而导致头疼的因素.web页面文档类型: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...

  3. iOS推送处理

    iOS收到推送后,跳转到某一页面 字数1348 阅读1001 评论4 喜欢26 以前做过推送, 但只是那种最基本的广播推送(向所有安装appde设备通知), 列播组播这种对指定用户推送消息还没做过, ...

  4. 58. Android一些开发习惯总结

    作者:漫步 链接:https://www.zhihu.com/question/27227425/answer/35973793 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  5. 【BZOJ-3786】星系探索 Splay + DFS序

    3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 647  Solved: 212[Submit][Status][Discuss] ...

  6. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  7. Visual Studio插件

    不定时更新,得到最好用的插件.(友情提示:安装插件时最好先备份系统) 1.Resharper 10.0.0.12.VS10x CodeMAP3.JavaScript Map Parser4.JScri ...

  8. Python基础0:变量 赋值 表达式和运算符

    变量: 前面我们在使用print()输出内容的时候,如果内容很长,后面要再次输出的时候,就需重新在输入一遍. 如果给输出的内容起个简单的别名.这样我们用简短的别名来代替长内容,下次要输出的时候就直接使 ...

  9. Codeforces Round #389 Div.2 E. Santa Claus and Tangerines

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  10. C#获取外网IP

    思路是通过WebRequest连接一些网上提供IP查询服务的网站,下载到含有你的IP的网页,然后用正则表达式提取出IP来 class Program { static void Main(string ...