`
talentluke
  • 浏览: 604738 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

二叉排序树算法

 
阅读更多

 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:
①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
③左、右子树本身又各是一棵二叉排序树。

   上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。

下面就是二叉排序树的插入、删除、查找算法。

#include <iostream>
using namespace std;

typedef struct  {
 unsigned int key1;
 unsigned int key2;
}KeyType;

typedef struct 
{
 // somethings user define ;
 
 
}BSTNode;

typedef struct
{
 KeyType key;
 
 BSTNode node;
 
}BSTree;

int compkey(KeyType x,KeyType y)
{
 int ret ;
 if((x.key1 == y.key1) && (x.ke2 == y.key2))
  ret = 0;
 else
  if((x.key1 > y.key1) || (x.key1 == y.key1) && (x.key2 > y.key2) )
   ret = 1;
  else
   ret =-1;
  
}

void InsertBST(BSTree *Tptr,KeyType key)

 //若二叉排序树 *Tptr中没有关键字为key,则插入,否则直接返回
 BSTNode *f,*p=*TPtr; //p的初值指向根结点
    while(p)
 { 
  //查找插入位置
  //树中已有key,无须插入
  if(compkey(p->key,key) == 0)return;
  
  f=p; //f保存当前查找的结点
  
  p=(compkey(key,p->key)<0 ? p->lchild:p->rchild; //若key<p->key,则在左子树中查找,否则在右子树中查找
 } //endwhile
 
 //生成新结点
 p=(BSTNode *)malloc(sizeof(BSTNode));
 
 p->key.key1 = key.key1;
 p->key.key2 = key.key2;
 
 p->lchild = p->rchild=NULL;
 
 //原树为空
 if(*TPtr==NULL) 
  *Tptr=p;
 else 
  if(compkey(key,f->key)<0)
   f->lchild=p;
  else f->rchild=p;
} //InsertBST

/**************************************************************************
②删除*p结点的三种情况
(1)*p是叶子(即它的孩子数为0)
     无须连接*p的子树,只需将*p的双亲*parent中指向*p的指针域置空即可。

(2)*p只有一个孩子*child
     只需将*child和*p的双亲直接连接后,即可删去*p。
  注意:
     *p既可能是*parent的左孩子也可能是其右孩子,而*child可能是*p的左孩子或
 右孩子,故共有4种状态。

(3)*p有两个孩子
     先令q=p,将被删结点的地址保存在q中;然后找*q的中序后继*p,并在查找过程
 中仍用parent记住*p的双亲位置。*q的中序后继*p一定是 *q的右子树中最左下的结
 点,它无左子树。因此,可以将删去*q的操作转换为删去的*p的操作,即在释放结
 点*p之前将其数据复制到*q中,就相当于删去了*q.
***************************************************************************/


void DelBSTNode(BSTree *Tptr,KeyType key)
{
 //在二叉排序树*Tptr中删去关键字为key的结点
 BSTNode *parent=NULL,*p=*Tptr,*q,*child;
 while(p)
 {
  //从根开始查找关键字为key的待删结点
  if(compkey(p->key,key) == 0) break;//已找到,跳出查找循环
  
  parent=p;  //parent指向*p的双亲
  p=(compkey(key , p->key)<0)? p->lchild:p->rchild;
  //在关p的左或右子树中继续找
 }
 if(!p) return; //找不到被删结点则返回
 
 q=p;  //q记住被删结点*p
 //*q的两个孩子均非空,故找*q的中序后继*p
 if(q->lchild && q->rchild) 
  for(parent=q,p=q->rchild;p->lchild;parent=p,p=p->lchild);
  
 //现在情况(3)已被转换为情况(2),而情况(1)相当于是情况(2)中rchild=NULL的状况
 child=(p->lchild)? p->lchild:p->rchild;
  
 //若是情况(2),则child非空;否则child为空
 if(!parent) //*p的双亲为空,说明*p为根,删*p后应修改根指针
  *Tptr=child;
 else  //若是情况(1),则删去*p后,树为空;否则child变为根
 { //*p不是根,将*p的孩子和*p的双亲进行连接,*p从树上被摘下
  if(p==parent->lchild) //*p是双亲的左孩子
   parent->lchild=child; 
  else parent->rchild=child; //*child作为*parent的左孩子

  //*child作为 parent的右孩子
  if(p!=q) //是情况(3),需将*p的数据复制到*q
  {
   q->key.key1=p->key.key1;
   q->key.key2=p->key.key2;
  }
  //若还有其它数据域亦需复制
 } //endif
 free(p); //释放*p占用的空间
} //DelBSTNode


BSTNode *SearchBST(BSTree T,KeyType key)
{ //在二叉排序树T上查找关键字为key的结点,成功时返回该结点位置,否则返回NUll
    if(T==NULL || (compkey(key,T->key)==0)) //递归的终结条件
  return T;//T为空,查找失败;否则成功,返回找到的结点位置
 if(compkey(key,T->key)<0)
  return SearchBST(T->lchild,key);
 else
  return SearchBST(T->rchild,key);//继续在右子树中查找
} //SearchBST 

 

 

 

 

此处有非递归版本

http://www.cnblogs.com/ljphhj/archive/2012/02/25/2367821.html

分享到:
评论

相关推荐

    数据结构 二叉排序树算法

    ### 数据结构——二叉排序树算法 #### 1. 插入新节点 二叉排序树(Binary Search Tree, BST),也称为二叉查找树或者二叉搜索树,是一种特殊的二叉树,其中每个节点的左子树只包含键值小于该节点的节点;右子树只...

    C++的二叉排序树算法

    ### C++中的二叉排序树算法详解 #### 引言 在计算机科学中,二叉排序树(Binary Search Tree,简称BST)是一种重要的数据结构,它不仅能够高效地存储数据,还能快速查找、插入和删除节点。二叉排序树的特点在于每...

    数据结构实验-二叉排序树算法

    掌握二叉排序树的存储方法,实现二叉排序树的创建、查找、插入、删除、平均查找长度等基本操作。 三、实验内容及要求 1、构造二叉排序树的存储结构。 2、实现创建、查找、插入、删除、平均查找长度等操作。

    实现二叉排序树的各种算法

    在"实现二叉排序树的各种算法"的实验中,通常会涉及以下关键算法: 1. **树的构建**:从一组有序或无序的数据中构建二叉排序树。这可以通过遍历数据并按照二叉排序树的规则逐个插入节点来实现。 2. **插入操作**:...

    二叉排序树插入

    二叉排序树插入算法是维护二叉排序树性质的关键步骤,它保证了树中每个节点都遵循左子树小于根节点、右子树大于根节点的规则,为后续的数据操作提供了基础。 为了理解二叉排序树插入算法,首先需要明确二叉排序树的...

    写一算法,判断一棵二叉树是否是一棵二叉排序树。

    在讨论具体算法之前,我们需要明确二叉排序树的基本概念及其性质。二叉排序树是一种非常重要的数据结构,在实际应用中有着广泛的应用场景,比如用于实现高效的查找、插入和删除操作。 #### 性质概述 - **左小右大**...

    数据结构 实现二叉排序树的各种算法(1)

    用函数实现如下二叉排序树算法:(1) 插入新结点(2) 前序、中序、后序遍历二叉树(3) 中序遍历的非递归算法(4) 层次遍历二叉树(5) 在二叉树中查找给定关键字(函数返回值为成功1,失败0) Input 第一行:准备...

    数据结构课程设计 二叉排序树与平衡二叉排序树

    在完成这个项目后,你将对二叉排序树和平衡二叉排序树有深入的理解,这对后续学习高级数据结构和算法,以及实际的软件开发工作都是非常有益的。同时,这也会提升你的编程技能,特别是处理复杂数据结构的能力。

    二叉排序树_17281183_刘梦婷_leavingtbk_二叉排序树_

    通过理解和熟练运用二叉排序树,我们可以有效地处理各种数据结构问题,提高算法的效率,尤其是在大数据量的情况下,其性能优势更为明显。二叉排序树的优化版本,如平衡二叉排序树(如AVL树和红黑树),更是广泛应用...

    二叉排序树算法实现C语言

    数据结构中的二叉排序树实现算法,C语言~~~~~~~~~~~~

    二叉排序树的建立、插入、查找和删除

    代码里有二叉排序树插入操作递归算法,二叉排序树插入操作非递归算法,二叉排序树删除操作,创建二叉排序树,二叉排序树查找递归算法,二叉排序树查找非递归算法

    数据结构之二叉排序树的生成

    通过阅读和分析这些代码,我们可以更深入地理解二叉排序树的内部机制,掌握数据结构和算法在实际编程中的应用。 总的来说,二叉排序树是一种实用的数据结构,广泛应用于各种需要高效查找和排序的场景,例如数据库...

    C语言实现二叉排序树生成算法

    根据给定的信息,本文将详细解释如何使用C语言实现二叉排序树的生成算法,并重点关注平衡二叉排序树的创建及遍历。 ### 一、二叉排序树基础概念 在深入了解具体的C语言代码实现之前,我们先来回顾一下二叉排序树...

    采用二叉链式结构做存储结构的二叉排序树建立和查找算法

    在二叉排序树中查找特定元素的算法相当简单: 1. 从根节点开始。 2. 如果根节点的值等于目标值,返回找到的节点。 3. 如果目标值小于根节点的值,递归地在左子树中查找。 4. 如果目标值大于根节点的值,递归地在右...

    数据结构二叉排序树及其操作实验报告

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种特殊类型的二叉树,其每个节点的左子树只包含比其小的元素,右子树包含比其大的元素,且整个树保持自平衡。在本实验报告中,我们将深入...

    二叉排序树C++

    二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树或有序二叉树,是一种自平衡的二叉树数据结构。在二叉排序树中,对于任意...通过练习和实践,可以深入理解二叉排序树的工作原理及其在数据结构和算法中的应用。

    二叉排序树查找算法

    在C++中实现二叉排序树查找算法,通常涉及以下几个关键步骤: 1. **定义节点结构体**: 首先,我们需要定义一个表示二叉树节点的结构体,包含一个整数值和两个指向子节点的指针。 ```cpp struct TreeNode { int ...

Global site tag (gtag.js) - Google Analytics