《資料結構與演算法 二叉查詢樹》

2021-09-05 07:08:02 字數 3773 閱讀 7491

二叉查詢樹(binary search tree),也被稱作二叉搜尋樹。設x是二叉查詢樹中的任意乙個結點,則x的鍵值大於等於它的左子樹中任意乙個結點的鍵值,小於等於它的右子樹中任意乙個結點的鍵值。

1、結點的前驅和後繼

結點的前驅:二叉樹中鍵值小於該結點的最大結點。

結點的後繼:二叉樹中鍵值大於該結點的最小結點

查詢前驅結點的方法:

如果x存在左孩子,則x的前驅結點為以其左孩子為根的子樹的最大結點  

如果x不存在左孩子:

1>x是乙個右孩子,前驅結點就是它的父結點

2>x是乙個左孩子,查詢x的最低父結點,並且x位於該父結點的右子樹中,前驅結點就是這個父結點 

查詢後繼結點的方法

如果x存在右孩子,則x的後繼結點為以其右孩子為根的子樹的最小結點  

如果x不存在右孩子:

1>x是乙個左孩子,後繼結點就是它的父結點

2>x是乙個右孩子,查詢x的最低父結點,並且x位於該父結點的左子樹中,後繼結點就是這個父結點 

2、插入結點

插入操作均是在葉結點處進行的,因此,只要按照插入結點的值找到相應的葉結點就ok了,程式中x、y表示兩個結點,x初始化為根結點,通過這兩個變數尋找新結點 z 的插入位置,根據x結點的值與z結點的值的比較結果選擇對應的路徑,直到x等於null,此時y就是我們想尋找的葉節點,這時只需將y和z鏈結起來就行。

//插入鍵值為key的結點(內部介面)

template void bstree::insert(node* &tree,node*z)

if(!y)//樹為空

tree=z;

else }

//插入鍵值為key的結點(外部介面)

templatevoid bstree::insert(t key)

3、刪除結點

根據鍵值進行刪除操作,刪除結點後還要維持二叉查詢樹的特點,真正被刪除的結點其實是這一類結點:最多只有乙個孩子結點,刪除這類結點非常簡單,只需要將它的孩子結點和它的父結點進行鏈結,再把自己釋放掉就行。當被刪除結點就是這類結點時,直接按上面的操作進行即可。當被刪除結點不是這類結點時,就需要找到乙個代替的點,這就是該結點的後繼結點,將該結點的鍵值變為後繼結點的鍵值,然後刪除後繼結點即可,容易知道後繼結點是上面描述的那類結點,因此照著描述進行操作即可。

//刪除結點(內部介面)

templatenode* bstree::remove(node* &tree,node*z)

//刪除結點,並返回結點(外部介面)

templatevoid bstree::remove(t key)

}

注意:程式使用了內部介面和外部介面,這樣做主要是因為資料成員 root 為私有變數

#includeusing namespace std;

templateclass node

}; templateclass bstree;

//建構函式

templatebstree::bstree()

//析構函式

templatebstree::~bstree()

//前序遍歷(內部介面)

templatevoid bstree::preorder(node* tree)

}//前序遍歷(外部介面)

templatevoid bstree::preorder()

//中序遍歷(內部介面)

templatevoid bstree::inorder(node* tree)

}//中序遍歷(外部介面)

templatevoid bstree::inorder()

//後序遍歷(內部介面)

templatevoid bstree::postorder(node*tree)

}//後序遍歷(外部介面)

templatevoid bstree::postorder()

//查詢鍵值為key的結點(遞迴實現) 內部介面

templatenode* bstree::search(node* x,t key)

//查詢鍵值為key的結點(遞迴實現) 外部介面

templatenode* bstree::search(t key)

//查詢鍵值為key的結點(非遞迴實現) 內部介面

templatenode* bstree::iterativesearch(node* x,t key)

return x;

}//查詢鍵值為key的結點(非遞迴實現) 外部介面

templatenode* bstree::iterativesearch(t key)

//查詢最大值(內部介面)

templatenode* bstree::maximum(node* tree)

//查詢最大值(外部介面)

templatet bstree::maximum()

//查詢最小值(內部介面)

templatenode* bstree::minimum(node* tree)

//查詢最小值(外部介面)

templatet bstree::minimum()

//結點的前驅:該結點的左子樹的最大結點

//結點的後繼:該結點的右子樹的最小結點

//查詢結點的前驅結點,即二叉樹中鍵值小於該結點的最大結點

/*如果x存在左孩子,則x的前驅結點為以其左孩子為根的子樹的最大結點

如果x不存在左孩子:

1>x是乙個右孩子,前驅結點就是它的父結點

2>x是乙個左孩子,查詢x的最低父結點,並且x位於該父結點的右子樹中,前驅結點就是這個父結點

*/templatenode* bstree::predecessor(node*x)

return y;

} //查詢結點的後繼結點,即二叉樹中鍵值大於該結點的最小結點

/*如果x存在右孩子,則x的後繼結點為以其右孩子為根的子樹的最小結點

如果x不存在右孩子:

1>x是乙個左孩子,後繼結點就是它的父結點

2>x是乙個右孩子,查詢x的最低父結點,並且x位於該父結點的左子樹中,後繼結點就是這個父結點

*/templatenode* bstree::successor(node*x)

return y;}

//插入鍵值為key的結點(內部介面)

template void bstree::insert(node* &tree,node*z)

if(!y)//樹為空

tree=z;

else }

//插入鍵值為key的結點(外部介面)

templatevoid bstree::insert(t key)

//刪除結點(內部介面)

templatenode* bstree::remove(node* &tree,node*z)

//刪除結點,並返回結點(外部介面)

templatevoid bstree::remove(t key)

}//列印(內部介面)

templatevoid bstree::print(node*tree,t key,int direction)

}//列印(外部介面)

templatevoid bstree::print()

//銷毀(內部介面)

templatevoid bstree::destroy(node* &tree)

}//外部介面

templatevoid bstree::destroy()

l2-004 這是二叉搜尋樹嗎?

資料結構與演算法 二叉查詢樹

1.建立bst樹 往bst樹中新增節點 公開的介面函式 param node 需要新增到bst樹的那個節點 public void add treenode node else 隱藏的函式,add方法的具體實現 param parent bst樹 或者子樹 的根節點 param child 要插入b...

資料結構與演算法 7 二叉查詢樹

一棵二叉查詢樹 bst 是一棵二叉樹,其中每個結點都含有乙個comparable的鍵 以及相關聯的值 且每個結點的鍵都大於其左子樹中的任意結點的鍵而小於右子樹的任意結點的鍵。和鍊錶一樣,我們巢狀定義了乙個私有類來表示二叉查詢樹上的乙個結點。每個結點都含有乙個鍵 乙個值 一條左鏈結 一條右鏈結和乙個結...

資料結構與演算法(2) 二叉查詢樹

1 右子樹所有節點關鍵字的值都要大於左子樹中的值 2 一般的情況 key left x key x key right 3 查詢操作最壞情況o n 平均情況o lg n 1 插入操作 struct node insert struct node root,struct node new 2 查詢某個...