資料結構學習筆記五 二叉查詢樹

2021-09-20 13:17:34 字數 3936 閱讀 5513

二叉查詢樹(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 樹的搜尋,從根結點開始,對結點內的關鍵字 有序 序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點 重複,直到所對應的兒子指標為空,或...