二叉排序樹的特徵
二叉排序樹或者是一棵空樹,或者是具有如下特性的二叉樹:
1.每一元素都有乙個鍵值, 而且不允許重複;
2.若它的左子樹不空,則左子樹上所有結點的值均小於根結點的值;
3.若它的右子樹不空,則右子樹上所有結點的值均大於根結點的值;
4.它的左、右子樹也都分別是二叉排序樹。
二叉排序樹儲存的元素構造
template class element二叉排序樹節點的設計與實現element():key(0) {}
type key;
//在這兒可以很容易的新增更多的資料
//方便對element進行擴充套件
};
template class bstnodeconst 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的關鍵字值。這意味著,該樹所有的元素以某種統一的方式排序。二叉查詢樹是一棵特殊的二叉樹,二叉查詢樹中節點的結構與二叉樹種節點的結構相同,關鍵在於可以在二叉查詢樹上可以執行的...