資料結構基礎 17 二叉查詢樹的設計與實現

2022-04-29 19:24:09 字數 3467 閱讀 4854

二叉排序樹的特徵

二叉排序樹或者是一棵空樹,或者是具有如下特性的二叉樹:

1.每一元素都有乙個鍵值, 而且不允許重複;

2.若它的左子樹不空,則左子樹上所有結點的值均小於根結點的值;

3.若它的右子樹不空,則右子樹上所有結點的值均大於根結點的值;

4.它的左、右子樹也都分別是二叉排序樹。

二叉排序樹儲存的元素構造

template class element

element():key(0) {}

type key;

//在這兒可以很容易的新增更多的資料

//方便對element進行擴充套件

};

二叉排序樹節點的設計與實現

template class bstnode

const type &getdata() const

private:

//node當中儲存的是element元素

elementdata;

bstnode *leftchild;

bstnode *rightchild;

void display(int i);

};

//中序遍歷二叉樹:

//能夠保證該二叉樹元素按照遞增順序列印出來

template void bstnode::display(int i)

二叉排序樹的構造

template class bstree

~bstree()

//二叉查詢樹的三大主力:插入, 刪除, 搜尋(又加入了乙個迭代搜尋)

//插入

bool insert(const element&item);

//刪除

void remove(const element&item)

//遞迴搜尋

const bstnode* search(const element&item)

//迭代搜尋

const bstnode*searchbyiter(const element&item);

//實用函式

void display() const

void visit(bstnode* currentnode) const

bool isempty() const

void makeempty(bstnode*subtree);

//中序遍歷

void levelorder() const;

private:

const bstnode* search(const element&item,

const bstnode*currentnode);

void remove(const element&item,

bstnode*¤tnode);

private:

bstnode*root;

};

二叉排序樹的插入演算法

根據動態查詢表的定義,「插入」

操作在查詢不成功時才進行;若二叉排序樹為空樹,則新插入的結點為新的根結點;否則,新插入的結點必為乙個新的葉子結點,其插入位置由查詢過程得到。

//二叉排序樹插入的實現與解析

template bool bstree::insert(const element&item)

bstnode*parentnode = null; //需要插入位置的父節點

bstnode*currentnode = root; //需要插入的位置

while (currentnode != null)

//此時已經查詢到了乙個比較合適的插入位置了

if (item.key < parentnode->data.key)

parentnode->leftchild = new bstnode(item);

else

parentnode->rightchild = new bstnode(item);

return true;

}

二叉排序樹的查詢演算法

若二叉排序樹為空,則查詢不成功;否則:

1.若給定值等於根結點的關鍵字,則查詢成功;

2.若給定值小於根結點的關鍵字,則繼續在左子樹上進行查詢;

3.若給定值大於根結點的關鍵字,則繼續在右子樹上進行查詢。

//二叉排序樹搜尋的設計與實現

//遞迴搜尋

template const bstnode* bstree::search(const element&item,

const bstnode*currentnode)

//迭代搜尋

template const bstnode*bstree::searchbyiter(const element&item)

return null;

}

二叉排序樹的刪除演算法

和插入相反,刪除在查詢成功之後進行,並且要求在刪除二叉排序樹上某個結點之後,仍然保持二叉排序樹的特性。

刪除分三種情況:

1.被刪除的結點是葉子節點:其雙親結點中相應指標域的值改為「空」, 並將該節點刪除;

2.被刪除的結點只有左子樹或者只有右子樹:其雙親結點的相應指標域的值改為 「指向被刪除結點的左子樹或右子樹」, 然後刪除該節點;

3.被刪除的結點既有左子樹,也有右子樹:以其前驅替代之,然後再刪除該前驅結點;

//二叉排序樹節點刪除的實現與解析如下

template void bstree::remove(const element&item,

bstnode*¤tnode)

//如果當前節點就是要刪除的節點

//並且其左子女(和/或)右子女為空

//預設包含了左右子女同時為空的情況:

//即: 在if中肯定為true

else}}

二叉查詢樹的幾個實用操作

//清空二叉樹

template void bstree::makeempty(bstnode*subtree)

}

//二叉查詢樹的層次遍歷

template void bstree::levelorder() const

}

二叉排序樹的效能分析

對於每一棵特定的二叉排序樹,均可按照平均查詢長度的定義來求它的 asl 值,顯然,由值相同的 n 個關鍵字,構造所得的不同形態的各棵二叉排序樹的平均查詢長度的值不同,甚至可能差別很大(如果二叉查詢樹退化成一條鍊錶, 則其插入/刪除/查詢的效能都會退化為o(n))。

但是在隨機情況下, 二叉排序樹的搜尋, 插入, 刪除操作的平均時間代價為o(logn);

C 資料結構 17 二叉查詢樹

ifndef bst h define bst h includeusing namespace std template class bst 宣告 enum boolean templateclass element 資料 templateclass bstnode 定義結點 templatecl...

(資料結構)二叉查詢樹

樹,是一種資料結構。它是由n個有限節點組成乙個具有層次關係的集合。特點 樹的基本術語 節點的度 節點擁有的子樹的數目。葉子 度為零的節點。分支節點 度不為零的節點。樹的度 樹中節點的最大的度。層次 根節點的層次為1,其餘節點的層次等於該節點的雙親的層次加1。樹的高度 樹中節點的最大層次。無序樹 如果...

資料結構 二叉查詢樹

使二叉樹成為二叉查詢樹的性質是,對於樹中的每個節點x,它的左子樹中所有關鍵字值小於x的關鍵字值,而它的右子樹中所有關鍵字值大於x的關鍵字值。這意味著,該樹所有的元素以某種統一的方式排序。二叉查詢樹是一棵特殊的二叉樹,二叉查詢樹中節點的結構與二叉樹種節點的結構相同,關鍵在於可以在二叉查詢樹上可以執行的...