二叉排序树(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 ...
随机推荐
- ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
看图:
- js-JavaScript高级程序设计学习笔记12
第十五章 使用canvas绘图 1.要使用<canvas>元素,必须先设置其width和height属性. 2.要在这块画布上绘图,需要先取得绘图上下文,取得绘图上下文对象的引用,需要调用 ...
- Leetcode 137. Single Number I/II/III
Given an array of integers, every element appears twice except for one. Find that single one. 本题利用XO ...
- RPCL(Rival Penalized Competitive Learning)在matlab下的实现
RPCL是在线kmeans的改进版,相当于半自动的选取出k个簇心:一开始设定N个簇心,N>k,然后聚类.每次迭代中把第二近的簇心甩开一段距离. 所谓在线kmeans是就是,每次仅仅用一个样本来更 ...
- win10前面板耳机没声音
首先去装Relteck的驱动,windows64位的下载地址是: http://12244.wpc.azureedge.net/8012244/drivers/rtdrivers/pc/audio/0 ...
- linux永久更改eth0的ip地址后仍然ping不通过
编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0 引用:DEVICE=eth0 //设备名称,不要修改 BOOTPROTO=static //不要修改 BRO ...
- UVa 673 Parentheses Balance
一个匹配左右括号的问题 /*UVa 673 Parentheses Balance*/ #include<iostream> #include<algorithm> #incl ...
- C#变量类型
在C#语言中,我们把变量分为七种类型,它们分别是:静态变量(static varibles),非静态变量(instance variables),数组元素(array elements),值参数(va ...
- Spring BeanUtils的用法
package test; import java.util.Date; import org.springframework.beans.BeanUtils; import test.basic.B ...
- MOOCULUS微积分-2: 数列与级数学习笔记 Review and Final
此课程(MOOCULUS-2 "Sequences and Series")由Ohio State University于2014年在Coursera平台讲授. PDF格式教材下载 ...