`
famoushz
  • 浏览: 2928769 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

二叉检索树

阅读更多

二叉检索树

  Copyright 2002 by Zhang Ming, PKUCS
  1. 定义及性质
  n二叉检索树或者是一颗空树;或者是具
  有下列性质的二叉树:对于任何一个结
  点,设其值为K,则该结点的左子树(若
  不空)的任意一个结点的值都小于K;该
  结点的右子树(若不空)的任意一个结点
  的值都大于或等于K;而且它的左右子树
  也分别为二叉检索树.
  n二叉检索树的性质: 按照中序周游将各结
  点打印出来,将得到按照由小到大的排
  列.
  Copyright 2002 by Zhang Ming, PKUCS
  BST图示
  Copyright 2002 by Zhang Ming, PKUCS
  检索
  n二叉检索树的效率就在于只需检索二个子树
  之一.
  -从根结点开始,在二叉检索树中检索值K.如果
  根结点储存的值为K,则检索结束.
  -如果K小于根结点的值,则只需检索左子树
  -如果K大于根结点的值,就只检索右子树
  n这个过程一直持续到K被找到或者我们遇上
  了一个树叶.
  n如果遇上树叶仍没有发现K,那么K就不在该
  二叉检索树中.
  Copyright 2002 by Zhang Ming, PKUCS
  2. 二叉检索树类定义
  // BSTimplementation for the Dictionary ADT
  template
  class BST : public Dictionary {
  private:
  BinNode* root; // Root of the BST
  intnodecount; // Number of nodes in the BST
  // Private "helper" functions
  void clearhelp(BinNode*);
  BinNode* inserthelp(BinNode*, const Elem&);
  BinNode* deletemin(BinNode*,
  BinNode*&);
  BinNode* removehelp(BinNode*, const Key&,
  BinNode*&);
  boolfindhelp(BinNode*, const Key&, Elem&) const;
  void printhelp(BinNode*, int) const;
  Copyright 2002 by Zhang Ming, PKUCS
  public:
  BST() { root = NULL; nodecount= 0; } // Constructor
  ~BST() { clearhelp(root); } // Destructor
  void clear()
  { clearhelp(root); root = NULL; nodecount= 0; }
  boolinsert(constElem& e) {
  root = inserthelp(root, e);
  nodecount++; return true;
  }
  boolremove(constKey& K, Elem& e) {
  BinNode* t = NULL;
  root = removehelp(root, K, t);
  if (t == NULL) return false; // Nothing found
  e = t->val(); nodecount--;
  delete t;
  return true;
  }
  Copyright 2002 by Zhang Ming, PKUCS
  boolremoveAny(Elem& e) { // Delete min value
  if (root == NULL) return false; // Empty tree
  BinNode* t;
  root = deletemin(root, t);
  e = t->val();
  delete t;
  nodecount--;
  return true;
  }
  boolfind(constKey& K, Elem& e) const
  { return findhelp(root, K, e); }
  intsize() { return nodecount; }
  void print() const {
  if (root == NULL) cout<< "The BST is empty.\n";
  else printhelp(root, 0);
  }
  };
  Copyright 2002 by Zhang Ming, PKUCS
  3. 二叉检索树的实现
  n插入中包含检索(可以重码)
  boolinsert(constElem& e) {
  root = inserthelp(root, e);
  nodecount++; return true;
  }
  nInserthelp的实现
  template
  BinNode* BST::
  inserthelp(BinNode* subroot, const Elem& val) {
  if (subroot== NULL) // Empty tree: create node
  return (new BinNodePtr(val, NULL, NULL));
  if (EEComp::lt(val, subroot->val())) // Insert on left
  subroot->setLeft(inserthelp(subroot->left(), val));
  else subroot->setRight(inserthelp(subroot->right(), val));
  return subroot; // Return subtreewith node inserted
  }
  Copyright 2002 by Zhang Ming, PKUCS
  BST插入图示
  Copyright 2002 by Zhang Ming, PKUCS
  检索
  template
  boolBST:: findhelp(
  BinNode* subroot, const Key& K, Elem&
  e) const {
  if (subroot== NULL) return false; // Empty tree
  else if (KEComp::lt(K, subroot->val())) // Check left
  return findhelp(subroot->left(), K, e);
  else if (KEComp::gt(K, subroot->val())) //Check right
  return findhelp(subroot->right(), K, e);
  else { e = subroot->val(); return true; } // Found it
  }
  Copyright 2002 by Zhang Ming, PKUCS
  打印
  template
  void BST::
  printhelp(BinNode* subroot, intlevel) const {
  if (subroot== NULL) return; // Empty tree
  printhelp(subroot->left(), level+1); //Do left subtree
  for (inti=0; icout<< " ";
  cout}
  Copyright 2002 by Zhang Ming, PKUCS
  4. 二叉检索树结点的删除
  n对于二叉检索树,删除一个结点,相当
  于删除有序序列中的一个记录,要求删
  除后能保持二叉检索树的排序特性,并
  且树高变化较小.
  (1)找到值为val的结点rt
  (2)rt为叶,可以直接删除
  (3)rt左空或右空,可以让它的右子树或
  左子树直接代替原rt
  (4)rt左右都不空,可以让右子树中的最
  小值代替原rt
  Copyright 2002 by Zhang Ming, PKUCS
  删除子树中最小值图示
  Copyright 2002 by Zhang Ming, PKUCS
  删除右子树中最小值结点
  Copyright 2002 by Zhang Ming, PKUCS
  删除rt子树中最小结点
  template
  BinNode* BST::
  deletemin(BinNode* subroot,
  BinNode*& min) {
  if (subroot->left() == NULL) { // Found min
  min = subroot;
  return subroot->right();
  }
  else { // Continue left
  subroot->setLeft(deletemin(subroot->left(), min));
  return subroot;
  }
  }
  Copyright 2002 by Zhang Ming, PKUCS
  删除值为val的结点
  template
  BinNode* BST::
  removehelp(BinNode* subroot, const Key& K,
  BinNode*& t) {
  if (subroot== NULL) return NULL; // Val is not in tree
  else if (KEComp::lt(K, subroot->val())) // Check left
  subroot->setLeft(removehelp(subroot->left(), K, t));
  else if (KEComp::gt(K, subroot->val())) // Check right
  subroot->setRight(removehelp(subroot->right(), K, t));
  else { // Found it: remove it
  BinNode* temp;
  t = subroot;
  Copyright 2002 by Zhang Ming, PKUCS
  if (subroot->left() == NULL) // Only a right child
  subroot= subroot->right(); // so point to right
  else if (subroot->right() == NULL) // Only a left child
  subroot= subroot->left(); // so point to left
  else { // Both children are non-empty
  subroot->setRight(deletemin(subroot->right(), temp));
  Elemte= subroot->val();
  subroot->setVal(temp->val());
  temp->setVal(te);
  t = temp;
  }
  }
  return subroot;
  }
  Copyright 2002 by Zhang Ming, PKUCS
  删除值为val的结点(续)
  else { // Found it: remove it
  BinNode* temp = rt;
  if (rt->left == NULL)
  rt= rt->right;
  else if (rt->right == NULL)
  rt= rt->left;
  else {
  temp = deletemin(rt->right);
  rt->setValue(temp->value()); }
  delete temp;
  } }
  Copyright 2002 by Zhang Ming, PKUCS
  讨论
  n所有操作都围绕BST的性质,并一定要保
  持这个性质
  n用非递归算法实现插入,检索,删除
  Copyright 2002 by Zhang Ming, PKUCS
  讨论(续)
  n允许有重复关键码
  时(右子树)
  -重复关键码应该有
  规律地出现
  -插入,检索,删除
  都考虑这个特点.
  尤其是删除,必须
  删右子树中最小(
  如果有重复,将是
  值与被删根结点相
  同的结点,因此能
  保持性质)

分享到:
评论

相关推荐

    c++实现在二叉检索树中删除一个结点的算法

    设计一个算法程序,使得该程序从二叉检索树中删除一个结点,并仍然保持二叉检索树的特性不变 实验要求: 创建一棵二叉检索树,然后用中序遍历查找要删除的结点的后继结点

    最优二叉检索树(Optimal Search Tree)

    ### 最优二叉检索树(Optimal Binary Search Tree) #### 概述 最优二叉检索树(Optimal Binary Search Tree, OBST),是一种特殊的二叉树结构,它旨在通过优化节点布局来降低查找数据时所需的平均成本。在构建...

    二叉检索树c语言版

    ### 二叉检索树C语言版知识点解析 #### 一、二叉检索树简介 二叉检索树(Binary Search Tree, BST),又称有序或排序二叉树,是一种特殊的二叉树数据结构,其中每个节点具有以下特性: - 节点包含一个键(Key)以及...

    二叉检索树及用最大堆实现的栈的代码

    二叉检索树与最大堆的实现代码及验证 验证题目: 1、编写一个能够统计输入文本中所出现的每个单词的词频。 输入:一个文本文件 输出:按照字典顺序将输入文本中出现的单词以及相应的词频排序输出结果 2、重新...

    二叉检索树.cpp 数据结构二叉检索树

    二叉检索树 c++数据结构 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材

    实验九 图和二叉检索树1

    在本实验中,我们将深入探讨图论和二叉检索树的相关概念。首先,我们要理解图的最小生成树,这是图论中的一个重要概念。最小生成树是指在一个加权无向图中,连接所有顶点的树形结构,其边的权重之和最小。Prim算法和...

    二叉检索树C++版

    ### 二叉检索树C++实现关键知识点解析 #### 一、二叉检索树简介 二叉检索树(Binary Search Tree, BST),又称有序或排序二叉树,是一种特殊的二叉树数据结构,其中每个节点具有以下特性:左子树上所有节点的值均小于...

    Binary Search Tree code 二叉检索树代码

    是Binary Search Tree code 二叉检索树的代码,实现了插入,删除,检索,遍历,包括先序遍历,中序遍历,后序遍历

    C/C++:二叉排序树.rar(含完整注释)

    设二叉排序树的二叉链表存储结构的类型定义如下: typedef struct node{ int data; //用整数表示一个结点的名 struct node *LChild,*RChild; //左右指针域 }BSTNode,*BSTree; 设计算法并编写程序求解以下几个问题...

    BST二叉排序树讲义

    - **二叉检索树**(Binary Search Tree, BST)是一种特殊的二叉树,它满足以下条件: - 该树可以为空树。 - 若非空,则每个节点具有一个键值(Key),并且对于任一节点N来说,如果N的键值为K,那么N的左子树中所有...

    删除排序二叉树的一个节点

    构建一个排序二叉树,然后删除其中一个结点,使剩下的结点仍构成一个排序二叉树

    用模板类建立一棵二叉排序树,请输入你要建树的所有数,1.显示树2查找3删除树

    cout建立一棵二叉排序树,请输入你要建树的所有数(以-1 作为结束标志!): "; Head=NULL; int number; cin&gt;&gt;number; while(number!=-1) { Head=buildTree(Head,number); cin&gt;&gt;number; } } template ...

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

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

    二叉排序树增删改查

    总的来说,理解和掌握二叉排序树的增删改查操作对于iOS开发者来说是非常有益的,它能帮助优化数据存储和检索,提高程序的效率。通过实践和调试,你可以深入理解这些基本操作背后的逻辑,这对于提升编程技能和解决...

    二叉排序树和折半查找

    二叉排序树广泛用于数据库索引、文件系统和虚拟内存管理等场景,而折半查找常用于大量有序数据的快速检索,如电子词典的单词查找。 9. **优化**: 对于频繁查询的场景,可以使用自平衡二叉排序树,如AVL树和红黑...

    vc++二叉排序树的程序

    二叉排序树(Binary Search Tree,BST),又称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它在计算机科学中扮演着重要角色,特别是在数据检索、排序和组织方面。VC++是Microsoft开发的一款集成开发...

    最优二叉搜索树算法及代码

    最优二叉搜索树,也称为最优化二叉查找树或动态二叉查找树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值和两个子节点,左子节点的键值小于当前节点,右子节点的键值大于当前节点。在最优二叉搜索树中,...

    二叉查找树实现简单的信息检索

    在"二叉查找树实现简单的信息检索"中,我们关注的是如何利用二叉查找树来高效地检索信息。首先,我们需要创建一个二叉查找树的数据结构。在提供的文件中,`Binary_tree.h`和`Binary_tree.cpp`很可能是定义和实现这个...

Global site tag (gtag.js) - Google Analytics