轉:C++實現的變種二分查詢法(折半查詢)--二叉查詢樹
轉載請註明出處:
基本思想: 當靜態查詢表是有序表,即表中結點是按關鍵字有序,並採用順序儲存結構時,可用折半查詢法。
折半查詢的查詢的過程是:先確定待查記錄所在的範圍(區間),然後逐步縮小查詢範圍,直到找到該記錄或者找不到為止。所謂"折半"的含義是指,先將給定值和所查區間中間位置的記錄的關鍵字進行比較,若相等,則查詢成功,否則,依給定值大於或小於該關鍵字繼續在後半個區間或前半個區間中進行查詢。
在這裡我們要講的則完全不同與此,採用順序二叉樹進行查詢,初始化的時候已經按照二分思想插入.
標頭檔案 stdafx.h
// 您可以自由轉載該作品,但必須保留原作者宣告條款:
// 來源:
// 作者:不知所謂 2006-09-25
//C++實現的變種二分查詢法(折半查詢)
#pragma once
#include
#include
// 以進對結點及樹進行定義
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檔案****************************************************
// 您可以自由轉載該作品,但必須保留原作者宣告條款:
// 來源:
// 作者:不知所謂 2006-09-25
//C++實現的變種二分查詢法(折半查詢)
// 主要是定義了結點TreeNode和樹Tree,並提供對樹的基本操作,包括查詢,刪除,插入.
// 構造樹的過程描述:使用者輸入的第一個數所得的結點作為根結點,以後儲存結點時,則按如下規則,
// 小於父結點則存放在父結點的左側,否則在右側
// 查詢規則:從根處開始匹配,如果小於,則往左,否則往右,直到查詢結束,查詢到則返回該結點的節點編號(itemid),失敗則返回0
#include "stdafx.h"
using namespace std;
void main(void)
{
Tree tree;
int d;
cout<for(int i=0;i<10;i++)
{
scanf("%d",&d);
tree.InsertNode(d);
}
cout<cin>>d;
int result = tree.SearchNode(d);
if(result > 0)
{
cout< //cout<
else
{
cout<}
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<itemid<
{
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();
}
轉載請註明出處:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/220284/viewspace-1024037/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 折半查詢(C++實現)C++
- 二分查詢【折半查詢】演算法 PHP 版演算法PHP
- 折半查詢法的平均查詢長度(成功/失敗)
- 二分搜尋(折半查詢)
- 二分查詢 | 二分查詢的一種推薦寫法
- 查詢——二分查詢
- 二叉查詢樹的插入刪除查詢
- Golang實現二分查詢法Golang
- 折半查詢排序樹畫圖和排序
- 二叉查詢樹
- BST查詢結構與折半查詢方法的實現與實驗比較
- 二分查詢法
- 二叉查詢樹概念及實現
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列
- 二分查詢(c++)C++
- 資料結構之查詢(順序、折半、分塊查詢,B樹、B+樹)資料結構
- 二叉查詢樹(查詢、插入、刪除)——C語言C語言
- 查詢演算法__二分查詢演算法
- JavaScript實現簡單二叉查詢樹JavaScript
- PHP 實現二分查詢PHP
- 二分查詢(一)——純粹的二分查詢
- SSH:hiberate實現資料的查詢(單查詢和全查詢)
- 圖解--二分查詢樹圖解
- 查詢演算法之二分查詢演算法
- 二叉查詢樹【二叉排序樹】構建和查詢演算法 PHP 版排序演算法PHP
- 第 34 題:如何實現二叉查詢樹?
- 二分查詢及其變種演算法演算法
- 二叉樹路徑查詢二叉樹
- Amazing tree —— 二叉查詢樹
- 二分法查詢(遞迴實現)遞迴
- 二分查詢(函式實現)函式
- Js實現二分查詢,加油JS
- 二分查詢
- 查詢最佳化——查詢樹結構
- SQL查詢的:子查詢和多表查詢SQL
- 【總結】二分查詢 —— 一種減而治之的查詢方法(1)
- 平衡查詢樹
- 多路查詢樹
- 平衡二叉查詢樹:紅黑樹