参考文章: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. Yii2的View中JS代码添加

    直接写 <script> $(function(){ alert("aaa"); }); <script> 会提示出错 是因为view中添加js代码的前面没 ...

  2. KVC、KVO、NSNotification、delegate 总结及区别

    1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...

  3. 【matlab】设定C++编译器

    在用matlab2016a,运行的代码涉及到C++混编,要用mex把C++代码编译出来. 记得几年前的matlab版本,通过: mex -setup 就可以设定了,选择要使用的编译器(文本的超链接), ...

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

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

  5. c3p0 泄漏

    一个很重要的资料来源 http://liu.fm/2015/07/15/c3p0/ c3p0 泄漏 标签: c3p0hibernatekillloggingspringdao 2011-06-16 1 ...

  6. bzoj3756: Pty的字符串

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  7. codevs1138 聪明的质监员

    题目描述 Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n 个矿石,从1到n 逐一编号,每个矿石都有自己的重量wi 以及价值vi.检验矿产的流程是:见图   ...

  8. CSS3伪类选择器:nth-child()(nth-child(odd)/nth-child(even))

    nth-child(odd):奇数 nth-child(even):偶数 使用时,如果是精确到数字时,切记是从同一级别的元素开始计算,而不是指定某个类才开始计算. 比如: <li>< ...

  9. String.Format将人民币符号改成美元符号{0:C}

    经过测试发现这个是和系统语言有关,如果直接使用{0:C}进行转换时会跟系统语言有关,中文则显示人民币,老美就是美元. 那么在使用时,直接增加区域配置:string.Format(new System. ...

  10. [NOIP2014] 普及组

    珠心算测验 模拟. 将所有“两个不同数之和”装进桶里,扫描原数组记录满足条件的数的个数. /*by SilverN*/ #include<iostream> #include<alg ...