二叉搜尋樹基本資料結構實現

2021-07-10 07:02:00 字數 3852 閱讀 2196

二叉搜尋樹中乙個結點包含3個指標left,right, prev和乙個衛星資料key。這三個指標分別指向左兒子,右兒子,父節點。如果孩子結點和父親結點不存在,相應指標為空。根結點的prev指向空。

1)遍歷(中序遍歷,先序遍歷,後續遍歷)

2)查詢乙個關鍵字,返回該關鍵字的結點指標

3).返回最大關鍵字最小關鍵字結點指標

4)尋找關鍵字key的後繼結點

5)插入關鍵字key

6)構建一顆二叉搜尋樹

7)刪除關鍵字key

1.遍歷之中序遍歷:遞迴中序遍歷比較簡單不多哆嗦。中序遍歷非遞迴方法:首先需要乙個棧來儲存待遍歷的結點:

a.先將根結點t=root壓入棧s中

b.若結點t不空或者棧不空,將結點t沿途的左兒子全部壓入棧中

c.棧頂元素t=s.top()出棧並訪問之,如果t的右兒子存在,則將t右兒子進棧,然後t=t->right

d.重複步驟b

2.查詢乙個關鍵字key的方法:首先從樹根開始比較。若key==x.key則找到,若key>x.key,則含關鍵字key的結點在x的右子樹中,否則在左字樹中。未找到則返回null。

3.返回最大最小元素:根據二叉搜尋樹性質可知,最大元素一定在樹的最右端(該結點沒有右兒子),最小結點一定在樹的最左端(該結點沒有左兒子)。

4.尋找關鍵字key的後繼結點。 後繼結點:乙個結點x的後是大於x->key的最小關鍵字的結點。方法:如果結點x的右子樹非空,x的後繼一定是x右子樹中最左的結點(右子樹中key值最小結點),若x的右兒子不存在。則x的後繼就要向上找,設y是向上尋找中移動的結點,直到遇到y是y父節點的左兒子為止,此時的y的父節點就是x的後繼。

5.插入關鍵字key,先找到插入的位置(一定是某個葉節點處),然後修改指標插入。下面是遞迴函式**(後面有非遞迴**)

bst* insert(bst *bt, int key)

else if (key > bt->key)

bt->right = insert(bt->right, key); //遞迴插入到左子樹

else if (key < bt->key)

bt->left = insert(bt->left,key); //插入到右子樹

return bt; //有相等的數就不用插入了

}

6.構建二叉搜尋樹就是不斷地插入關鍵字

7.刪除相對來說有點麻煩;分為四種情況,要刪除的結點無兒子,只有左兒子,只有右兒子,同時有左右兒子。遞迴**如下:

templatenode* delete(node*root, t key)

else if (key < root->key)

else

else if (!root->right)

else

} return root;

}

以下是二叉搜尋樹基本資料結構非遞迴的c++實現。注意模板類的定義和實現在都包含在標頭檔案中。

/*bintree.head*/

#pragma once

#include#includeusing namespace std;

templatestruct node;

templateclass bintree

node*getroot()const

int getnumberofnode()const

void insertkey(t const &key);

void creatbintree(t const *a, int const &n);

void inorderprint();

node* findkey(t const &key);

bool deletekey(t const &key);

node* treemaxmum();

node* treeminmum();

node* treesuccessor(node*z);

};template void bintree::insertkey(t const &key)

node* x = root;

node* x_prev = nullptr; //表示x的前驅

while (x != nullptr) //將y插入在x_prev後面

y->prev = x_prev;

if (key > x_prev->key)

x_prev->right = y;

else

x_prev->left = y;

totalnode_++;

}templatevoid bintree::inorderprint()

if (!s.empty())

} cout << endl;

}template void bintree::creatbintree(t const *a, int const &n)

template node* bintree::findkey(t const &key)

return x; //找到就返回此節點,否則返回空

}templatenode* bintree::treemaxmum()

return x;

}templatenode* bintree::treeminmum()

return x;

}templatenode* bintree::treesuccessor(node* z)

/*否則一定在x的有左孩子的最低層祖先*/

node*y = x->prev;

while (y&&x != y->left)

return y;

}templatevoid bintree::transplant(node*u, node*v)

templatebool bintree::deletekey(t const &key)

transplant(deletenode, y); //完成右邊子樹代替

y->left = deletenode->left; //處理deletenode左邊子樹

deletenode->left->prev = y;

} return true;

}

/*源.cpp*/

#include"bintree.h"

int main();

bintreenewtree;

newtree.creatbintree(a,8); //構建二叉搜尋樹

newtree.inorderprint();

node*pos = newtree.findkey('h');

cout << pos->key << endl;

pos = newtree.treeminmum();

cout << pos->key << endl;

pos = newtree.findkey('c');

pos = newtree.treesuccessor(pos);

cout << pos->key << endl;

newtree.insertkey('a');

newtree.inorderprint();

newtree.deletekey('b');

newtree.inorderprint();

return 0;

}

基本資料結構 二叉搜尋樹(C 實現)

目錄測試 參考資料 二叉搜尋樹 英語 binary search tree 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 如圖所示 所有的節點,都滿足左子樹上的所有節點都比自己的小,而右子樹上的所有節點都比自己大這個條件。因為二叉搜尋樹的性質,二叉搜尋樹能夠高效地進行如下...

基本資料結構 二叉樹(binary tree)

基本資料結構 二叉樹 binary tree c 二叉樹首先是一棵樹,每個節點都不能有多於兩個的兒子,也就是樹的度不能超過2。二叉樹的兩個兒子分別稱為 左兒子 和 右兒子 次序不能顛倒。如圖1是乙個簡單的二叉樹。二叉樹的種類 一種是滿二叉樹,除了最後一層的葉子節點外,每一層的節點都必須有兩個兒子節點...

二叉搜尋樹c 資料結構二叉搜尋樹

在n個動態的整數中搜尋某個整數?檢視其是否存在 假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度 o n 如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度 o logn 但是新增 刪除的平均時間複雜度是 o n 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...