轉:C++實現的變種二分查詢法(折半查詢)--二叉查詢樹

herosoft發表於2009-07-10

轉載請註明出處:

基本思想: 當靜態查詢表是有序表,即表中結點是按關鍵字有序,並採用順序儲存結構時,可用折半查詢法。
折半查詢的查詢的過程是:先確定待查記錄所在的範圍(區間),然後逐步縮小查詢範圍,直到找到該記錄或者找不到為止。所謂"折半"的含義是指,先將給定值和所查區間中間位置的記錄的關鍵字進行比較,若相等,則查詢成功,否則,依給定值大於或小於該關鍵字繼續在後半個區間或前半個區間中進行查詢。


在這裡我們要講的則完全不同與此,採用順序二叉樹進行查詢,初始化的時候已經按照二分思想插入.

[@more@]

標頭檔案 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 != 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();
}

轉載請註明出處:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/220284/viewspace-1024037/,如需轉載,請註明出處,否則將追究法律責任。

相關文章