演算法導論(5) 二叉搜尋樹

2021-07-15 06:01:10 字數 2744 閱讀 6913

二叉搜尋樹

設x是二叉搜尋樹的乙個結點,如果y是x左子樹的乙個結點,那麼y.key≤x.key,如果y是x有字數的乙個結點,那麼y.key≥x.key。

二叉樹有三種遍歷的方法:

先序遍歷:輸出根的關鍵字在其左右子樹的關鍵字之前。

中序遍歷:輸出根的關鍵字在其左右子樹的關鍵字之間。

後序遍歷:輸出根的關鍵字在其左右子樹的關鍵字之後。

主要的操作包括查詢,遍歷,最大最小關鍵字尋找,前驅後繼結點查詢,插入和刪除。**如下:

class node

;//二叉搜尋樹

class bstree

void treeinsert(node &root, node &z);//插入結點

node treesearch(node *root, int k);//查詢結點

void treewalk(node *root);//遍歷

node treemin(node *root);//尋找結點root下最小值結點

node treemax(node *root);//尋找結點root下最大值結點

node treesuccessor(node *x);//尋找結點x的後繼結點

node treeprodecessor(node *x);//尋找結點x的前驅結點

void treetransplant(node &root, node *u, node *v);//在根結點root下移動子樹v到u

void treedelete(node &root, node *z);//刪除結點

};#include

#include

"binarysearchtree.h"

using namespace std;

node::node(int k):key(k)

bool node::operator

== (node &z)

else

}node& node::operator

= (node &z)

int node::getkey()

void node::setkey(int k)

//查詢、最大值、最小值、前驅、後繼函式均可以在o(h)時間內完成,h為樹的高度

node bstree::treesearch(node *root, int k)//查詢結點

if (k < root->getkey())

else

return0;}

void bstree::treewalk(node *root)//中序遍歷

}node bstree::treemin(node *root)//尋找結點root下最小值結點

return

*x;}

node bstree::treemax(node *root)//尋找結點root下最大值結點

return

*x;}

node bstree::treesuccessor(node *x)//尋找結點x的後繼結點

y = x->

parent;

//如果父結點也為空,無後繼結點

//父結點存在時,後繼結點為它的最底層祖先,並且後繼結點的左結點也是它的祖先

//因此迴圈的終止條件為x == y->right,當x是乙個左孩子時終止,x的父結點為後繼結點

while (y !=

null

&& x == y->right)

//y=null時,返回y會出錯

if (y !=

null)

return0;}

node bstree::treeprodecessor(node *x)//尋找結點x的前驅結點

y = x->

parent;

//與後繼結點類似,當x為右孩子時終止,x父結點為前驅結點

while (y !=

null

&& x == y->left)

if (y !=

null)

return0;}

void bstree::treeinsert(node &root, node &z)//插入結點

else}z.

parent

= y;

//判斷樹是否為空

if (y ==

null)

else

if (z.getkey() < y->getkey())

else

}void bstree::treetransplant(node &root, node *u, node *v)//在根結點root下移動子樹v到u

else

if (u == u->

parent

->left)

else

if (v !=

null)

}void bstree::treedelete(node &root, node *z)//刪除結點

else

if (z->right ==

null)

else

//如果後繼結點就是它的右孩子,並且這個右孩子沒有左孩子,否則不可能是後繼結點,因此直接拿後繼結點替換

treetransplant(root, z, y);

y->left = z->left;

y->left->

parent

= y;

}

}

結構上,指標、引用的應用都比較亂,只做參考。

演算法導論 二叉搜尋樹

搜尋樹資料結構支援許多動態集合操作,包括search minimum maximum predecessor successor insert和delete等。因此,我們使用一棵搜尋樹既可以作為乙個字典又可以作為乙個優先佇列。二叉搜尋樹上的基本操作所花費的時間與這棵樹的高度成正比。對於乙個有n個結點...

演算法導論二叉搜尋樹

兩天寫完的,沒有認認真真的測試,可能有些bug,自己測試的資料能過,但是我的初始化有些問題,不知道該怎麼表示 二叉搜尋樹 include include using namespace std struct node void inorder search node root1 node tree ...

《演算法導論》筆記 二叉搜尋樹

演算法 資料結構 二叉搜尋樹 binary search tree 是經過一定地組織形成的有特定結構特徵的二叉樹,支援各種動態集合 dynamic set 操作 如insert delete maximum minimum等等 這些操作的時間複雜度與樹的高度成正比。一棵有n個節點的完全二叉樹 com...