二叉搜尋樹的簡單操作與實現

2021-08-14 13:24:23 字數 3626 閱讀 9427

二叉搜尋樹(binarysearchtree)性質

二叉搜尋樹首先是一棵二叉樹,二叉樹可能為空,而一顆非空的二叉搜尋樹要滿足以下條件:

(1)每個元素有乙個關鍵字,所有關鍵字是唯一的。(關鍵字不唯一的二叉搜尋樹叫有重複值的二叉搜尋樹)

(2)在根節點的左子數的元素都小於根節點的關鍵字。

(3)在根節點的右子數的元素都大於根節點的關鍵字。

(4)根節點的左右子樹也是一棵二叉搜尋樹

二叉搜尋樹的結構

c++**:

template struct bstnode     //二叉搜尋樹節點結構

};

template class mybstree

;

二叉搜尋樹的查詢

查詢的遞迴實現(c++):

//查詢的遞迴實現

template bstnode* mybstree::find(bstnode* root,const k& thekey)

if (root->key > thekey)

else if (root->key < thekey)

else

}

查詢的迭代實現(c++):

template bstnode* mybstree::find(const k& thekey)

else if (currentnode->key < thekey)

else

}return null;

}

二叉搜尋樹的插入

二叉搜尋樹的插入步驟:

首先查詢二叉搜尋樹是否有節點的關鍵字和要插入的相同,有的話則不插入;

如果沒有與要插入的節點的關鍵字相同的節點,則將該節點作為搜尋中斷的節點的孩子插入二叉搜尋樹。

插入的遞迴實現

template bool mybstree::insert(bstnode*& root ,const k& thekey, const v& thevalue)

if (root->key >thekey)

else if (root->key < thekey)

else

}

插入的迭代實現

//插入的迭代實現

template bool mybstree::insert(const k& thekey, const v& thevalue)

bstnode* currentnode = rootnode;

bstnode* parentnode = null;

while (currentnode != null) //尋找插入位置

else if (currentnode->key < thekey)

else

} //找到插入位置後,判斷是左節點還是右節點,建立新的節點並與parentnode進行連線

if (parentnode->key >thekey)

else if (parentnode->key < thekey)

return true;

}

二叉搜尋樹的刪除

二叉搜尋樹刪除的步驟:

要考慮三種情況:(1)p是葉子節點(2)p只有只有一棵非空子樹(3)p有兩棵非空子樹

當p為葉子節點,只需要把p的父節點對應子樹置為null,如果p為根節點,則令根節點為null。

當p有一棵非空子樹,子樹繼承p的位置。

當p有兩棵非空子樹,找到p的最近前驅,來替代p的位置,並將前驅刪去,用前驅的子樹替代前驅位置。

刪除的遞迴實現:

//刪除遞迴實現

template bool mybstree::erase(bstnode*& root,const k& thekey)

if (root->leftchild == null&&root->rightchild == null) //只有根節點

else

}if (root->key > thekey)

else if (root -> key < thekey)

else //找到要刪除的節點

else if (root ->rightchild == null) //沒有右子樹

else //既有左子樹也有右子樹

//前驅替換要刪除的節點

swap(root->key, closestnode->key);

swap(root->value, closestnode->value);

erase(root->leftchild);

} }}

刪除的迭代實現:

//刪除迭代實現

template bool mybstree::erase(const k& thekey)

if (rootnode->leftchild ==null&& rootnode->rightchild ==null) //只有根節點

return false;

} bstnode* parentnode = null;

bstnode* currentnode = rootnode;

while (currentnode != null)

else if (currentnode->keyrightchild;

} else

if (parentnode->key>currentnode->key)

else if (parent->keykey)

}else if (currentnode->rightchild == null) //沒有右子樹,同沒右左子樹

if (parentnode->key>currentnode->key)

else if (parent->keykey)

}else //既有左子樹也有右子樹

currentnode->key = closestnode->key;

currentnode->value = closestnode->value;

if (tempnode != currentnode)

tempnode->rightchild = closestnode->leftchild;

else

delete tempnode;

}return true;

} }}

二叉搜尋樹的遍歷

根據二叉搜尋樹的性質,所以二叉樹的中序遍歷可以得到有序表。

中序遍歷的實現(c++)

//中序遍歷

template void mybstree::inorder()

inorder(rootnode->leftchild);

cout << rootnode->key<<" ";

inorder(rootnode->rightchild);

}

二叉搜尋樹的簡單實現

查詢是否有某個元素,找到返回true,找不到返回false public boolean contains int key else if key else return false 插入某元素,如果已經包含該元素則返回false,插入成功就返回true public boolean insert ...

二叉搜尋樹的簡單實現

上述條件反之亦可 接近二分查詢,最大查詢次數為樹的高度,平均查詢次數log2 n template class t struct bstnode template class t class bstree else if cur val val else if cur val val return ...

二叉搜尋樹的簡單實現

二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹 1.若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值 2.若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值 3.它的左右子樹也分別為二叉搜尋樹 pragma once templatestruct bstre...