二叉搜尋樹中乙個結點包含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 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...