前言 :
如果一個二元樹符合 "每一個節點的資料大於左子節點且小於右子節點", 這棵樹便稱為二分樹. 因為二分數方便用來排序及搜尋, 包括二元排序樹或是二元搜尋樹都是二分樹的一種. 當建立一棵二元排序樹後, 接著也要清楚知道如何在一排序樹中搜尋某一筆資料, 事實上二元搜尋或二元排序樹可以說是一體兩面. 其中二元搜尋樹T 具有以下特點 :
二元搜尋樹 :
基本上只要懂二元樹的排序就可以理解二元樹的搜尋. 只需在二元樹中比較樹根與欲搜尋的值, 在依 左子樹 > 樹根 > 右子樹的原則走訪二元樹就可以找到我們打算搜尋的值.
範例代碼 :
* BinarySearchTree.h 代碼 :
* BinarySearchTree.cpp 代碼 :
* 呼叫演算法代碼 :
執行結果 :
補充說明 :
* [ 資料結構 小學堂 ] 樹狀結構導論 : 二元運算樹進階研究 - 二元排序樹
* [ 資料結構 小學堂 ] 樹狀結構導論 : 二元樹的走訪
* Wiki - 二元搜尋樹
如果一個二元樹符合 "每一個節點的資料大於左子節點且小於右子節點", 這棵樹便稱為二分樹. 因為二分數方便用來排序及搜尋, 包括二元排序樹或是二元搜尋樹都是二分樹的一種. 當建立一棵二元排序樹後, 接著也要清楚知道如何在一排序樹中搜尋某一筆資料, 事實上二元搜尋或二元排序樹可以說是一體兩面. 其中二元搜尋樹T 具有以下特點 :
二元搜尋樹 :
基本上只要懂二元樹的排序就可以理解二元樹的搜尋. 只需在二元樹中比較樹根與欲搜尋的值, 在依 左子樹 > 樹根 > 右子樹的原則走訪二元樹就可以找到我們打算搜尋的值.
範例代碼 :
* BinarySearchTree.h 代碼 :
- #include
- using namespace std;
- class BinarySearchTreeNode{
- public:
- int data;
- class BinarySearchTreeNode *left;
- class BinarySearchTreeNode *right;
- BinarySearchTreeNode(){
- data = -1;
- left = NULL;
- right = NULL;
- }
- };
- typedef class BinarySearchTreeNode bstNode;
- typedef bstNode *bstNodePoint;
- class BinarySearchTree{
- bstNodePoint root;
- public:
- BinarySearchTree(){root=NULL;}
- virtual void add_Node_To_Tree(int value);
- virtual void createTree(int *m, int len);
- virtual bool search(int *v);
- };
- #include "BinarySearchTree.h"
- bool BinarySearchTree::search(int *v) {
- bstNodePoint currentNode = root;
- if(root == NULL) {
- return false;
- } else {
- int loopCount = 0;
- bool isDone = false;
- bool isFound = false;
- while(!isDone) {
- loopCount++;
- if(currentNode->data > *v) { // 往左子樹移動
- if(currentNode->left == NULL) {
- isFound = false;
- isDone = true;
- } else {
- currentNode = currentNode->left;
- }
- } else if(currentNode->data < *v) { // 往右子樹移動
- if(currentNode->right == NULL) {
- isFound = false;
- isDone = true;
- } else {
- currentNode = currentNode->right;
- }
- } else {
- isFound = true;
- isDone = true;
- }
- }
- cout << "共搜尋 " << loopCount << "次!" << endl;
- return isFound;
- }
- }
- void BinarySearchTree::createTree(int *matrix, int len) {
- for(int i=0; i
- this->add_Node_To_Tree(matrix[i]);
- }
- }
- void BinarySearchTree::add_Node_To_Tree(int value) {
- bstNodePoint currentNode;
- bstNodePoint newnode;
- newnode = new bstNode();
- newnode->left = NULL;
- newnode->right = NULL;
- newnode->data = value;
- if(root == NULL) {
- root = newnode;
- } else {
- currentNode = root;
- int flag=0; // 用來紀錄是否插入新的節點
- while(!flag) {
- if(currentNode->data > value) { // 往左子樹移動
- if(currentNode->left == NULL) {
- currentNode->left = newnode;
- flag = 1;
- } else {
- currentNode = currentNode->left;
- }
- } else if(currentNode->data < value){ //往右子樹移動
- if(currentNode->right == NULL) {
- currentNode->right = newnode;
- flag = 1;
- } else {
- currentNode = currentNode->right;
- }
- } else { // 二元搜尋樹沒有相同值的節點
- flag = 1;
- }
- }
- }
- }
- void ch06_06(bool b) {
- if(b) {
- int data[] = {7, 4, 1, 5, 13, 8, 11, 12, 15, 9, 2};
- BinarySearchTree bsTree;
- bsTree.createTree(data, 11);
- int sv = 0;
- while(sv != -1) {
- cout << "請輸入搜尋值 (輸入-1離開) : ";
- cin >> sv;
- if(bsTree.search(&sv)) {
- cout << "你要找的值 [" << sv << "] 有找到 !" << endl;
- } else {
- cout << "你要找的值 [" << sv << "] 沒有找到 ==\"" << endl;
- }
- }
- }
- }
執行結果 :
補充說明 :
* [ 資料結構 小學堂 ] 樹狀結構導論 : 二元運算樹進階研究 - 二元排序樹
* [ 資料結構 小學堂 ] 樹狀結構導論 : 二元樹的走訪
* Wiki - 二元搜尋樹
This message was edited 5 times. Last update was at 25/04/2010 15:18:12
沒有留言:
張貼留言