關於二叉查詢樹,介紹肯定是很多的,這裡我列舉的下面的**和思想,是按照二叉查詢樹,但是沒有使用二叉樹的資料結構,而是按照陣列索引建立邏輯上的二叉樹結構,並使用二叉樹的遞迴方式查詢給定的值,並在注釋中對不同的情況提出一點自己的看法,建立樹的過程參考堆排序的思想,並且在結構上大致相同,所以需要注意的地方也基本上相同,前面介紹了推排序需要注意的地方,這裡有幾個地方需要說明的是,裡面有一段二分查詢的函式**,只是前面使用過,放在這裡也是為了和後面做個對比,並且該函式和我們一般使用的二分查詢演算法略有不同,**注釋中提到了,下面就直接將詳細的**和注釋貼出來。
#include #include #include #include using namespace std;
/*主要是這幾種基本的演算法: 1 順序查詢,
2 二分查詢
3 二叉查詢樹,基礎是一顆排序樹,建立樹的方法可以參考二叉堆,
查詢按遞迴即可,至於插入和刪除只要看是影響前面還是後面的節
點,調整即可,參考二叉堆
4 *//*
二分查詢,是不分順序的查詢演算法,在基本有序的情況下,
使用有序的二分查詢演算法效率確實高很多
*/template int binarysearch(t array,int s,int e,t &t)
int m=(s+e)>>1;
int result = binarysearch(array,s,m,t);
if(result != -1) return result;
return binarysearch(array,m+1,e,t);
}/*
下面使用二叉查詢樹,有幾個基本的過程:1 建立二叉查詢樹,
按照建立推的方法建立,2 調整二叉查詢樹,3 遍歷樹
*///二叉樹的資料結構
// template // struct binarynode;
/* 這裡我想針對不同的情況應該有兩種解決方案: 1 第一種是已經存在二叉樹,只需要遍歷查詢
2 第二種就是需要自己建立,然後查詢,
這裡我選擇實現第二種解決方案,但是不使用二叉樹的資料結構參考推的建立方法,用位置繫結
節點之間的關係。
*///這個函式還真是蛋疼,雖然很簡單,但是很頭疼
template void exchange(t &t1,t &t2, t &t3)
else }}
template void buildbinarytree(t array,int n)
/* 還存在乙個問題, 就是找到了原來的節點之後,因為調整過
原來的節點,所以輸出的對應的位置和原來輸入的序列的位置
不同,這裡可以從資料結構上變動,
struct {
t t;
size_t location; //儲存輸入時位置資訊
}; 最後按照對應的位置即可找到輸入時的序列的位置
*/template //i表示當前查詢到的節點
int binarytreesearch(t array,int i,int size,t &t)
// template //size可以不用,直接用後面的節點
// void adjustbinarytree(binarynode *currentnode)if()
//
// }
int main()
}
資料結構之二叉查詢樹
針對二叉查詢樹的操作 增刪改查 的時間和樹的高度成正比,比如都有10個節點的乙個樹,樹高為4和樹高為10的操作時間肯定是不同的,這個時間實際上是o lgn 二叉查詢樹的期望的樹高是lgn,從而基本動態集合的操作平均時間為 lgn 通常二叉查詢樹基於鍊錶實現,每個節點儲存左,右子節點,如果想更方便的實...
資料結構之二叉查詢樹
二叉樹成為二叉查詢樹的性質是,對於樹種的每個節點x,他的左子樹中的所有關鍵字的值均小於x的關鍵字的值,而他的右子樹中的所有關鍵字的值均大於x的關鍵字的值。這意味著,該樹的所有元素均可以是用某種統一的方式排序。tree.h pragma once we define the binary tree.s...
資料結構之二叉查詢樹
二叉查詢樹 binary search tree 又被稱為二叉搜尋樹。設x為二叉查詢樹中的乙個結點,x節點包含關鍵字key,節點x的key值記為 ke y x k ey x 如果y是x的左子樹中的乙個結點,則 ke y y ke y x k ey y ke y x 如果y是x的右子樹的乙個結點,則 ...