`

C++实现的变种二分查找法(折半查找)--二叉查找树

阅读更多
C++实现的变种二分查找法(折半查找)--二叉查找树

转载请注明出处:http://hi.baidu.com/ipress/

基本思想:
   当静态查找表是有序表,即表中结点是按关键字有序,并采用顺序存储结构时,可用折半查找法。
   折半查找的查找的过程是:先确定待查记录所在的范围(区间),然后逐步缩小查找范围,直到找到该记录或者找不到为止。所谓"折半"的含义是指,先将给定值和所查区间中间位置的记录的关键字进行比较,若相等,则查找成功,否则,依给定值大于或小于该关键字继续在后半个区间或前半个区间中进行查找。


在这里我们要讲的则完全不同与此,采用顺序二叉树进行查找,初始化的时候已经按照二分思想插入.

头文件 stdafx.h

// 您可以自由转载该作品,但必须保留原作者声明条款:
// 来源:http://hi.baidu.com/ipress
// 作者:不知所谓 2006-09-25

//C++实现的变种二分查找法(折半查找)

#pragma once


#include <iostream>
#include <tchar.h>

// 以进对结点及树进行定义
class Tree;
class TreeNode
{
public:
friend class Tree;
private:
int data;
int itemid;//编号,按输入的顺序递增
TreeNode *leftTreeNode;
TreeNode *rightTreeNode;
TreeNode(int d=0)
{
   data = 0;
   itemid = d;
   leftTreeNode = 0;
   rightTreeNode = 0;
}
};
class Tree
{
public:
Tree();
~Tree();
int InsertNode(int value = 0);
void DeleteNode(TreeNode * node);
int SearchNode(int value);
private:
TreeNode *root; //根
int count; //记录结点总数
TreeNode *DestinationNode(int d,TreeNode *currentNode);//查找要插入的位置.
TreeNode *DestinationNode(int d);//查找要插入的位置.
};

//****************************************************cpp文件****************************************************

// 您可以自由转载该作品,但必须保留原作者声明条款:
// 来源:http://hi.baidu.com/ipress
// 作者:不知所谓 2006-09-25

//C++实现的变种二分查找法(折半查找)
// 主要是定义了结点TreeNode和树Tree,并提供对树的基本操作,包括查找,删除,插入.
// 构造树的过程描述:用户输入的第一个数所得的结点作为根结点,以后存储结点时,则按如下规则,
// 小于父结点则存放在父结点的左侧,否则在右侧
// 查找规则:从根处开始匹配,如果小于,则往左,否则往右,直到查找结束,查找到则返回该结点的节点编号(itemid),失败则返回0


#include "stdafx.h"
using namespace std;

void main(void)
{
Tree tree;
int d;
cout<<"开始建立树,循环输入10个整数:\n"<<endl;
for(int i=0;i<10;i++)
{
   scanf("%d",&d);
   tree.InsertNode(d);
}
cout<<"请输入要查找的值(如果树中存在N个相同的值,则只返回第一个):\n"<<endl;
cin>>d;

int result = tree.SearchNode(d);

if(result > 0)
{
   cout<<"查找成功,该数值位于编号为 "<<result<<" 结点上";
   //cout<<result<<endl;
}
else
{
   cout<<"查找失败."<<endl;
}

cin.get();
cin.get();
}

//插入结点到树
int Tree::InsertNode(int value)
{
count++;
TreeNode *tn = new TreeNode(value);
tn->itemid = count;
tn->data = value;

if(root == NULL)
{
   root = tn;
}
else
{
   TreeNode *ctn = DestinationNode(value);
   if (ctn != NULL)
   {
    if (ctn->data > value)
    {
     ctn ->leftTreeNode = tn;
    }
    else
    {
     ctn ->rightTreeNode = tn;
    }
   }
}
return count;
}
//从指定结点开始遍历树
TreeNode * Tree::DestinationNode(int d,TreeNode *currentNode)
{
TreeNode *tn = currentNode;

if (tn == NULL)
{
   return tn;
}

if (tn->data > d)
{
   if( tn->leftTreeNode != NULL)
    return DestinationNode(d,tn->leftTreeNode);
   else
    return tn;
}
else
{
   if( tn->rightTreeNode != NULL)
    return DestinationNode(d,tn->rightTreeNode);
   else
    return tn;
}
}
//从根点遍历树
TreeNode * Tree::DestinationNode(int d)
{
return DestinationNode(d,root);
}

//value为需要查找的值,返回值为节点的itemid值
int Tree::SearchNode(int value)
{
TreeNode *tn = root;

while (tn)
{
   if(tn->data == value)
   {
    return tn->itemid;
   }

   if(tn->data > value)
   {
    tn = tn->leftTreeNode;
   }
   else
   {
    tn = tn->rightTreeNode;
   }
}
return 0;
}
//从结点node处开始删除节点,真正的删除顺序是从叶子开始的.
void Tree::DeleteNode(TreeNode *node)
{
//cout<<"删除"<<node->itemid<<endl;
if (node != NULL)
{
   if (node->leftTreeNode != NULL)//删除左节点
    DeleteNode(node->leftTreeNode);
   if (node->rightTreeNode != NULL)//删除右节点
    DeleteNode(node->rightTreeNode);
   delete node;
   node = 0;
   count--;
}
}
Tree::Tree()
{
root = 0;
count = 0;
}
Tree::~Tree()
{
DeleteNode(root);
//cin.get();
}

分享到:
评论

相关推荐

    二叉排序树和折半查找

    折半查找,也称为二分查找,适用于有序数组。首先确定中间元素,然后与目标值比较。如果目标值小于中间元素,就在数组的左半部分继续查找;如果目标值大于中间元素,就在右半部分查找;如果相等,则查找成功。这个...

    综合查找算法(顺序查找、折半查找、二叉排序树、哈希表)-数据结构课程设计

    **折半查找**,也称为二分查找,适用于有序数组。它通过不断将查找区间减半来缩小搜索范围,平均时间复杂度为O(log n)。折半查找的优势在于效率高,但前提是数据必须事先排序,且不支持动态插入和删除操作。 **二叉...

    中序遍历二叉查找树并折半查找

    中序遍历 二叉查找树 折半查找,适合初学者。

    C++数据结构折半查找法(二分查找)

    折半查找法,也称为二分查找法,是一种高效的搜索算法,尤其适用于已排序的数组或列表。本教程将深入探讨这个主题,帮助数据结构初学者理解和掌握这种强大的查找技术。 **一、二分查找法的基本概念** 二分查找法是...

    顺序查找表 二分查找表 折半查找表 二叉排序树 C#源代码

    这里我们聚焦于四个关键概念:顺序查找表、二分查找表(也称折半查找表)、二叉排序树以及C#编程语言。这些知识点在计算机科学和软件工程中都有着广泛的应用。 1. **顺序查找表**: 顺序查找是最基础的查找方法,...

    顺序查找,折半查找,二叉排序树,哈希表

    顺序查找、折半查找、二叉排序树、哈希表 在计算机科学中,查找是指在数据集合中寻找特定元素的过程。查找算法是计算机科学中的一种基本算法,广泛应用于各个领域。下面,我们将介绍四种常见的查找算法:顺序查找、...

    二叉查找树 C++源代码 数据结构

    C++源代码实现二叉查找树时,通常会定义一个节点结构体或类,包括键、值以及左右子节点的指针。以下是一个简单的节点定义: ```cpp struct TreeNode { int key; int value; TreeNode* left; TreeNode* right; }...

    折半查找、二叉排序树、链式哈希表的建立与查找

    本文详细介绍了折半查找、二叉排序树以及链式哈希表的建立与查找等关键概念和实现方法。通过这些基本的数据结构和算法,可以有效地管理和检索数据,提高程序的效率。理解并掌握这些知识点对于学习更高级的数据结构和...

    折半查找(二分查找)折半查找(二分查找)折半查找(二分查找)

    "折半查找(二分查找)" 折半查找(二分查找)是一种高效的查找算法,对于顺序存储的有序表,可以快速地找到指定的关键字记录。该算法的基本思想是,每次比较给定值 K 与中间位置记录的关键字值,并根据比较结果...

    查找(折半,二叉排序树,二叉平衡树,B树,散列表)

    代码和讲解 字符串,模式匹配,BF模式匹配,算法 查找(顺序,折半,插值,斐波那契,分块,二叉排序树,二叉平衡树,B树,散列表)代码和讲解,内容详细全面,通俗易懂,通过测试,代码可以直接使用,方便大家学习.

    折半查找 减治法-C语言

    折半查找,也称为二分查找,是一种在有序数组中查找特定元素的有效方法。它的基本思想是,首先确定中间元素,然后比较目标值与中间元素,如果目标值等于中间元素,查找结束;如果目标值小于中间元素,那么在数组的左...

    数据结构实验(单链表的基本操作,二叉树的遍历,折半查找和二叉排序树,内部排序)的实现

    在这个实验中,我们专注于四个关键的算法和数据结构:单链表的基本操作、二叉树的遍历、折半查找以及二叉排序树,还有内部排序的实现。 首先,单链表是一种线性数据结构,其中每个元素(节点)包含数据和一个指向下...

    C语言实现顺序表的顺序查找和折半查找

    因此,学习如何在顺序表中实现查找是非常重要的。下面,我们将详细介绍C语言实现顺序表的顺序查找和折半查找。 一、顺序查找 顺序查找是一种简单的查找方法,它从数组的第一个元素开始,依次比较每个元素直到找到...

    折半查找算法

    折半查找算法(Binary Search),也称为二分查找算法,是一种在有序数组中查找特定元素的高效算法。它的基本思想是在有序数组中通过比较中间元素与目标值来逐步缩小查找范围,直到找到目标值或查找范围为空为止。 #...

    C++二分查找(折半查找)算法实例详解

    C++二分查找(折半查找)算法实例详解 C++二分查找(折半查找)算法是计算机科学中的一种查找算法,主要用于在有序列表中查找特定元素。该算法的优点是比较次数少,查找速度快,平均性能好,但它也存在一些缺点,如要求...

    数据结-构查找算法二分查找二叉顺序数哈希查找

    - 对于二叉查找树,除了查找,还包括插入和删除操作,理解二叉查找树的平衡策略(如AVL树、红黑树)对于优化性能至关重要。 - **哈希表的查找**: - 学习哈希函数的设计和冲突解决策略,如线性探测再散列、双散列...

    C+++版二分查找

    #### 二、C++二分查找实现 在给定的代码示例中,作者首先使用了冒泡排序算法对输入的数组进行排序,然后利用递归方式实现了二分查找算法。 #### 三、冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复...

    查找算法集(顺序查找、二分查找、插值查找、动态查找)

    二分查找是一种高效的查找算法,它的实现方式是将数组或链表分成两个部分,然后比较目标元素和中间元素,如果目标元素小于中间元素,则在左半部分继续查找,否则在右半部分继续查找。二分查找的时间复杂度为O(logn)...

    数据结构查找、排序、二分查找、折半查找算法

    在这个主题中,我们主要关注查找和排序算法,特别是二分查找(折半查找)算法。这些算法在实际编程中具有广泛应用,包括数据库索引、搜索引擎优化和各种计算问题的解决。 首先,我们来看查找算法。查找是数据结构中...

    折半查找算法实现(C++).doc

    折半查找算法实现(C++) 折半查找算法是数据结构与算法中的一种重要查找方法,它可以通过数学方法计算其时间复杂度。在本文中,我们将详细介绍折半查找算法的实现,并提供 C++ 语言的代码实现。 一、折半查找算法...

Global site tag (gtag.js) - Google Analytics