二叉查詢樹(binary search tree),又被稱為二叉搜尋樹。
它是特殊的二叉樹:對於二叉樹,假設x為二叉樹中的任意乙個結點,x節點包含關鍵字key,節點x的key值記為key[x]。如果y是x的左子樹中的乙個結點,則key[y] <= key[x];如果y是x的右子樹的乙個結點,則key[y] >= key[x]。那麼,這棵樹就是二叉查詢樹。如下圖所示:
在二叉查詢樹中:
(01) 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
(02) 任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
(03) 任意節點的左、右子樹也分別為二叉查詢樹。
(04) 沒有鍵值相等的節點(no duplicate nodes)。
public class bstree>
}}
bstree是二叉樹,它保護了二叉樹的根節點mroot;mroot是bstnode型別,而bstnode是二叉查詢樹的節點,它是bstree的內部類。bstnode包含二叉查詢樹的幾個基本資訊:
(01) key – 它是關鍵字,是用來對二叉查詢樹的節點進行排序的。
(02) left – 它指向當前節點的左孩子。
(03) right – 它指向當前節點的右孩子。
(04) parent – 它指向當前節點的父結點。
前序遍歷
若二叉樹非空,則執行以下操作:
(01) 訪問根結點;
(02) 先序遍歷左子樹;
(03) 先序遍歷右子樹。
根–左--右
private void preorder(bstnodetree)
}public void preorder()
中序遍歷
若二叉樹非空,則執行以下操作:
(01) 中序遍歷左子樹;
(02) 訪問根結點;
(03) 中序遍歷右子樹。
左–根--右
private void inorder(bstnodetree)
}public void inorder()
後序遍歷
若二叉樹非空,則執行以下操作:
(01) 後序遍歷左子樹;
(02) 後序遍歷右子樹;
(03) 訪問根結點。
左–右--根
private void postorder(bstnodetree)
}public void postorder()
遞迴:
private bstnodesearch(bstnodex, t key)
int cmp = key.compareto(x.key);
if(cmp < 0)else if(cmp > 0)else
}public bstnodesearch(t key)
非遞迴:
private bstnodeiterativesearch(bstnodex, t key)else if(cmp>0)else
return x;
}public bstnodeiterativesearch(t key)
最大值:private bstnodemaximum(bstnodetree)
while(tree.right!=null)
return tree;
}public t maximum()
return null;
}
最小值private bstnodeminimum(bstnodetree)
while(tree.left!=null)
return tree;
}public t minimum()
return null;
}
節點的前驅:是該節點的左子樹中的最大節點。
節點的後繼:是該節點的右子樹中的最小節點。
查詢前驅節點:
public bstnodepredecessor(bstnodex) // 如果x存在左孩子,則"x的前驅結點"為 "以其左孩子為根的子樹的最大結點"。
// 如果x沒有左孩子。則x有以下兩種可能:
// (01) x是"乙個右孩子",則"x的前驅結點"為 "它的父結點"。
// (01) x是"乙個左孩子",則查詢"x的最低的父結點,並且該父結點要具有右孩子",找到的這個"最低的父結點"就是"x的前驅結點"。
bstnodey = x.parent;
while((y!=null)&&(x==y.left))
return y;
查詢後繼節點:
public bstnodesuccessor(bstnodex)
// 如果x沒有右孩子。則x有以下兩種可能:
// (01) x是"乙個左孩子",則"x的後繼結點"為 "它的父結點"。
// (02) x是"乙個右孩子",則查詢"x的最低的父結點,並且該父結點要具有左孩子",找到的這個"最低的父結點"就是"x的後繼結點"。
bstnodey = x.parent;
while ((y!=null) && (x==y.right))
return y;
}
private void insert(bstreebst, bstnodez)
z.parent = y;
if (y==null)
bst.mroot = z;
else
}/*
* 新建結點(key),並將其插入到二叉樹中
* * 引數說明:
* tree 二叉樹的根結點
* key 插入結點的鍵值
*/public void insert(t key)
/*
* 刪除結點(z),並返回被刪除的結點
* * 引數說明:
* bst 二叉樹
* z 刪除的結點
*/private bstnoderemove(bstreebst, bstnodez)
/* * 刪除結點(z),並返回被刪除的結點
* * 引數說明:
* tree 二叉樹的根結點
* z 刪除的結點
*/public void remove(t key)
/*
* 列印"二叉查詢樹"
* * key -- 節點的鍵值
* direction -- 0,表示該節點是根節點;
* -1,表示該節點是它的父結點的左孩子;
* 1,表示該節點是它的父結點的右孩子。
*/private void print(bstnodetree, t key, int direction)
}public void print()
/*
* 銷毀二叉樹
*/private void destroy(bstnodetree)
public void clear()
資料結構 五 二叉樹(Binary Tree)
二叉樹 binary tree 是n n 0 個結點的有限集合,該集合或者空集 空二叉樹 或由乙個結點和兩棵互不相交的 分別稱為根結點的左子樹和右子樹的二叉樹組成。圖5.1 1 每個結點最多兩棵樹,所以二叉樹的結點的度最大為2 2 左子樹和右子樹是有序的 3 即使樹中某結點只有一棵樹,也要區分它是左...
資料結構 五 二叉樹 堆
實現乙個二叉查詢樹,並且支援插入 刪除 查詢操作 實現乙個二叉查詢樹,並且支援插入 刪除 查詢操作 typedef char datatype typedef struct bnode btnode,btptr createlbtree btptr bt 建立以bt為根節點指標的二叉鍊錶結構 i 節...
資料結構學習筆記 B B 樹
b 樹是一種非二叉的查詢樹,即一般化的bst,除了要滿足查詢樹的特性外,還滿足以下特性 一棵m階的b樹 所有的葉子節點位於同一層 如,m 3 b 樹的搜尋,從根結點開始,對結點內的關鍵字 有序 序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點 重複,直到所對應的兒子指標為空,或...