二叉排序樹的定義——
二叉排序樹( binary sort tree)或者為空;或者是具有如下特性的二叉樹:
(1)若根的左子樹不空,則左子樹上所有結點的關鍵字均小於根結點的關鍵字;
(2)若根的右子樹不空,則右子樹上所有結點的關鍵字均大於根結點的關鍵字;
(3)根的左、右子樹也分別是二叉排序樹。
一棵二叉排序樹的中序遍歷結果:關鍵字按從小到大的順序排列。
二叉排序樹的查詢——
若二叉排序樹為空,則查詢不成功;否則
1)若給定值等於根結點的關鍵字,則查詢 成功;
2)若給定值小於根結點的關鍵字,則繼續在左子樹上進行查詢;
3)若給定值大於根結點的關鍵字,則繼續在右子樹上進行查詢。
// 二叉樹的二叉鍊錶結點結構定義
typedef struct bitnode
bitnode, *bitree;
// 遞迴查詢二叉排序樹 t 中是否存在 key
// 指標 f 指向 t 的雙親,其初始值呼叫值為 null
// 若查詢成功,則指標 p 指向該資料元素結點,並返回 true
// 否則指標 p 指向查詢路徑上訪問的最後乙個結點,並返回 false
status searchbst(bitree t, int key, bitree f, bitree *p)
else if( key == t->data ) // 查詢成功
else if( key < t->data )
else
}
二叉排序樹的插入——若二叉排序樹為空,則新結點做根,否則從根出發進行查詢。查詢成功時空操作,查詢不成功時將新結點作為查詢路徑上最後乙個結點的左孩子或右孩子。新結點總是作為二叉排序樹的葉子。二叉排序樹的插入操作之中包含著乙個查詢操作,該查詢操作應具備兩項功能:
1)確定要插入的關鍵字key在二叉排序樹中是否存在;
2)當查詢不成功時返回插入位置(即查詢路徑上最後乙個結點的位址)。
// 當二叉排序樹 t 中不存在關鍵字等於 key 的資料元素時,
// 插入 key 並返回 true,否則返回 false
status insertbst(bitree *t, int key)
else if( key < p->data )
else
return true;
}else
}
二叉排序樹的刪除——二叉排序樹中結點的刪除操作只能在查詢成功的前提下進行,並且在二叉排序樹上刪除某個結點之後,應使其保持二叉排序樹的特性。刪除方法可分三種情況討論:(1)被刪除的結點是葉子;——其雙親結點中相應指標域的值改為「空」(2)被刪除的結點只有左子樹或只有右子樹;——其雙親結點的相應指標域的值改為指向被刪除結點的左子樹或右子樹的根。
(3)被刪除的結點既有左子樹,也有右子樹。——以其前驅替代之,然後再刪除該前驅結點
status deletebst(bitree *t, int key)
else
else if( key < (*t)->data )
else
}}status delete(bitree *p)
else if( (*p)->lchild == null )
else
//替換資料
(*p)->data = s->data;
if( q != *p )
else
free(s);
}return true;
}
二叉排序樹查詢效能的分析——由於新插入的結點總是做葉子,所以二叉排序樹的形態與關鍵字的插入順序有關。
由值相同的n個關鍵字,構造所得的不同形態的各棵二叉排序樹的平均查詢長度的值不同,甚至可能差別很大。
資料結構與演算法 二叉排序樹
如下 示例 package binarysorttree public class node override public string tostring 新增節點 public void add node node if node.value this.value else else else ...
資料結構 二叉排序樹 c
要求 1.若查詢成功,返回元素在有序陣列中的位置和查詢次數 2.若查詢失敗,返回出錯標誌和查詢次數。include using namespace std typedef int keytype typedef int infotype typedef struct elemtype typedef...
資料結構與演算法 二叉排序樹 BST
二叉排序樹 bst binary sort search tree 對於二叉排序樹的任何乙個非葉子節點,要求左子節點的值比當前節點的值小,右子節點的值比當前節點的值大。特別說明 如果有相同的值,可以將該節點放在左子節點或右子節點。比如針對資料 7,3,10,12,5,1,9 對應的二叉排序樹為 二叉...