二叉排序樹又稱二叉查詢樹,它或是一棵空的二叉樹,或是具有下列性質的二叉樹:
由上述定義可知,中虛遍歷二叉排序樹可以得到乙個按關鍵碼有序的序列。
[cpp]view plain
copy
?template
struct binode
class bisorttree
void bisorttree::insertbst(binode*root,binode*s)
bisorttree::bisorttree(int r,int n)
} //在二叉排序樹中刪除乙個節點f的左孩子節點p的演算法:
//1.若節點p是葉子,則直接刪除節點p
//2.若節點p只有左子樹,則需重接p的左子樹;若節點p只有右子樹,則需重接p的右子樹
//3.若節點p的左右子樹都不為空,則
// 3.1查詢節點p的右子樹上的最左下節點s以及節點s的雙親節點par
// 3.2將節點s的資料域替換到被刪除節點p的資料域
// 3.3若節點p的右孩子無左子樹,則將s的右子樹接到par的右子樹上;否則將s的右子樹接到節點par的左子樹上
// 3.4刪除節點s;
void bisorttree::deletebst(binode*p,binode*f)
else
if(p->rchild==null)
else
if(p->lchild==null)
else
p->data=s->data;
if(par==p)
par->rchild=s->rchild;
else
par->lchild=s->rchild;
delete s;
} }
binode*bisorttree::searchbst(binode*root,int k)
templatestruct binode
class bisorttree
void bisorttree::insertbst(binode*root,binode*s)
bisorttree::bisorttree(int r,int n)
}//在二叉排序樹中刪除乙個節點f的左孩子節點p的演算法:
//1.若節點p是葉子,則直接刪除節點p
//2.若節點p只有左子樹,則需重接p的左子樹;若節點p只有右子樹,則需重接p的右子樹
//3.若節點p的左右子樹都不為空,則
// 3.1查詢節點p的右子樹上的最左下節點s以及節點s的雙親節點par
// 3.2將節點s的資料域替換到被刪除節點p的資料域
// 3.3若節點p的右孩子無左子樹,則將s的右子樹接到par的右子樹上;否則將s的右子樹接到節點par的左子樹上
// 3.4刪除節點s;
void bisorttree::deletebst(binode*p,binode*f)
else if(p->rchild==null)
else if(p->lchild==null)
else
p->data=s->data;
if(par==p)
par->rchild=s->rchild;
else
par->lchild=s->rchild;
delete s;
}}binode*bisorttree::searchbst(binode*root,int k)
給定值的比較次數等於給定值節點在二叉排序樹中的層數。如果二叉排序樹是平衡的,則n個節點的二叉排序樹的高度為log
2n+1,其查詢效率為o(log
2n),近似於折半查詢。如果二叉排序樹完全不平衡,則其深度可達到n,查詢效率為o(n),退化為順序查詢。一般的,二叉排序樹的查詢效能在o(log
2n)到o(n)之間。因此,為了獲得較好的查詢效能,就要構造一棵平衡的二叉排序樹。
b 樹查詢時間複雜度 二叉排序樹的時間複雜度
終於開始寫二叉排序樹。如果這裡有個程式,裡面有兩個程式塊,它們是先後順序。第乙個程式塊執行時間複雜度是o n 第二個程式塊執行時間複雜度也是o n 我的大腦就會覺得這個程式總的時間複雜度就是 o n o n 好像很大,好像其實比起o n 2 還是小的。因為常數係數似乎可以忽略不計。可能因為我大腦不喜...
二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...
二叉排序樹
name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...