最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++深入細(xì)致探究二叉搜索樹

 更新時間:2022年05月24日 10:56:02   作者:Suk-god  
二叉搜索樹是以一棵二叉樹來組織的。每個節(jié)點是一個對象,包含的屬性有l(wèi)eft,right,p和key,其中,left指向該節(jié)點的左孩子,right指向該節(jié)點的右孩子,p指向該節(jié)點的父節(jié)點,key是它的值

1、二叉搜索樹的概念

 二叉搜索樹又稱二叉排序樹,它可以是一顆空樹,亦可以是一顆具有如下性質(zhì)的二叉樹:

  ①若根節(jié)點的左子樹不為空,則左子樹上的所有節(jié)點的值域都小于根節(jié)點的值

  ②若根節(jié)點的右子樹不為空,則右子樹上的所有節(jié)點的值域都大于根節(jié)點的值

  ③根節(jié)點的左右子樹分別也是一顆二叉搜索樹

例如下面的這棵二叉樹就是一棵二叉搜索樹:

注意:判定一棵二叉樹是否為二叉搜索樹一定要緊扣二叉搜索樹的概念~

2、二叉搜索樹的操作

聲明:該文章討論的是二叉搜索樹中節(jié)點值唯一的情況。

二叉搜索樹的查找

對于查找部分,充分利用二叉搜索樹的特性,即右子樹的value 大于根節(jié)點,左子樹的value小于根節(jié)點。

例如:查找下圖中的紅色方框中的節(jié)點

以6對應(yīng)的節(jié)點為列,查找過程主要經(jīng)歷如下幾個步驟:

  ①6與根節(jié)點5比較,6 > 5,因此到5的右子樹查找

  ①6與根節(jié)點7比較,6 < 7,因此到7的左子樹查找

  ①6與根節(jié)點6比較,6 == 6,此時查找成功!

總結(jié)基本步驟:

若根節(jié)點不為空:

  如果根節(jié)點的key == 查找的key----->返回true

  如果根節(jié)點的key > 查找的key----->轉(zhuǎn)到根節(jié)點的右子樹查找

  如果根節(jié)點的key < 查找的key----->轉(zhuǎn)到根節(jié)點的左子樹查找

否則(根節(jié)點為空了),直接返回false,表示樹中不存在要查找的key

二叉搜索樹的插入

主要分兩大類的情況進(jìn)行討論:

1、樹為空,直接插入

如下圖所示:

2、樹不空

①按照二叉搜索樹的性質(zhì)查找插入的位置

②插入新的節(jié)點

e.g:在下面的二叉搜索樹中插入-1

第一步,查找插入位置:

 注意:要標(biāo)記當(dāng)前訪問的節(jié)點的雙親,否則,就算找到了插入位置,由于無法訪問其雙親,也是無法進(jìn)行插入的。這里使用parent來標(biāo)記當(dāng)前訪問節(jié)點的雙親節(jié)點。

具體過程如下圖:

第二步,插入新節(jié)點

判斷待插入節(jié)點(node)的值與parent標(biāo)記的節(jié)點值的大小關(guān)系

if(node->value < parent->value)//新節(jié)點作為parent的左孩子
{
	parent->left = node;
}
else//新節(jié)點作為parent的右孩子
{
	parent->right = node;
}

以上就是二叉搜索樹插入的兩大類情況及其處理方式

二叉搜索樹的刪除

刪除也是分為兩大步驟:

1、找到待刪除結(jié)點,并標(biāo)記其雙親

具體代碼片段如下:

Node* delNode = root;//標(biāo)記待刪除結(jié)點
Node* parent = nullptr;//標(biāo)記待刪除結(jié)點的雙親
while(delNode)
{
	if(delNode->value == value)
	{
		break;
	}
	else if(delNode->value > value)
	{
		parent = delNode;
		delNode = delNode->left;
	}
	else
	{
		parent = delNode;
		delNode = delNode->right;
	}
}

上述代碼執(zhí)行完畢后,delNode有兩種情況,delNode == nullptr || delNode!=nullptr

下面我們就這兩種情況展開討論:

2、刪除該節(jié)點

Ⅰ、nullptr == delNode

  說明在二叉搜索樹中不存在要刪除的結(jié)點。直接return false;

Ⅱ、delNode != nullptr;

  在二叉搜索樹中找到了刪除結(jié)點,開始刪除。

刪除時,對于待刪除結(jié)點要根據(jù)其孩子節(jié)點分情況討論:

  ①待刪除結(jié)點是葉子結(jié)點

  ②待刪除結(jié)點只有左孩子

  ③待刪除結(jié)點只有有孩子

  ④待刪除結(jié)點左右孩子均存在

下面,我們就這4中情況展開討論:

情況一:待刪除結(jié)點時葉子節(jié)點

可以直接刪除,具體如下圖:

情況二:待刪除結(jié)點只有左孩子

在此前提下,有兩類情形

1、delNode的雙親存在  

2、delNode的雙親不存在

下面就這兩種情況展開討論:

1、delNode的雙親存在

刪除過程見下圖:

2、delNode的雙親不存在

與上述僅存在葉子節(jié)點時存在的問題一樣,需要在delete待刪除結(jié)點之前,判斷delNode與parent的位置關(guān)系,進(jìn)而確定是更新parent的left指針域還是right指針域

結(jié)合上述兩種情況,初步確定僅有左孩子的刪除代碼片段如下:

if(nullptr == parent)
{
	root = delNode->left;
}
else
{
	if(delNode == parent->left)
	{
		parent->left = delNode->left;
	}
	else
	{
		parent->right = delNode->left;
	}
}
delete delNode;

我們結(jié)合刪除節(jié)點是葉子節(jié)點 && 刪除節(jié)點僅有左子樹兩種情況來看,發(fā)現(xiàn)這兩種情況可以進(jìn)行合并。合并后的代碼如下圖:

情況三:待刪除結(jié)點只有右孩子

該情況與只有左孩子的分析過程一樣,存在兩類情形,分別是

1、delNode的雙親存在  

2、delNode的雙親不存在

這里不再進(jìn)行分析,直接給出代碼:

情況四:待刪除結(jié)點左右孩子均存在

明確:該情況無法直接刪除,需要在其子樹中尋找替代結(jié)點 具體刪除步驟如下:

1、找替代節(jié)點:在delNode的右子樹(左子樹)找最左側(cè)(最右側(cè))的結(jié)點并保存其雙親

2、將替代節(jié)點中的值域賦值給待刪除結(jié)點

3、將替代節(jié)點刪除掉

①如果替代節(jié)點找的是delNode右子樹的最左側(cè)結(jié)點,那么待刪除的替代節(jié)點一定不會有左子樹,可能會有右子樹

②如果替代節(jié)點找的是delNode左子樹的最右側(cè)結(jié)點,那么待刪除的替代節(jié)點一定不會有右子樹,可能會有左子樹 注意:一般情況下采用delNode右子樹的最左側(cè)結(jié)點作為替代節(jié)點

具體過程見下圖:

ok,下面給出實現(xiàn)的代碼:

3、二叉搜索樹的實現(xiàn)

數(shù)據(jù)結(jié)構(gòu):

template<class T>
struct BSTNode//每一個結(jié)點的結(jié)構(gòu)
{
	BSTNode<T>* _left;//左指針域
	BSTNode<T>* _right;//右指針域
	T _value;//值域

	BSTNode(const T& value = T())
		:_left(nullptr)
		, _right(nullptr)
		, _value(value)
	{}
};

采用模板的方式實現(xiàn),具體代碼見 BinarySearchTree

4、二叉搜索樹的性能分析

插入和刪除操作都必須先查找,查找效率代表了二叉搜索樹中各個操作的性能

對于有n個結(jié)點的二叉搜索樹,若每個元素查找的概率相等,則二叉搜索樹平均查找長度是結(jié)點在二叉搜索樹的深度的函數(shù)。即結(jié)點越深,比較次數(shù)越多。

但對于同一個關(guān)鍵碼的集合,如果各關(guān)鍵碼插入的次序不同,可能會得到不同的二叉搜索樹:

最優(yōu)情況下:二叉搜索樹為完全二叉樹,其平均比較次數(shù)為log2N

最差情況下:二叉搜索樹退化為單支樹,其平均比較次數(shù)為N/2

因此,二叉搜索樹的時間復(fù)雜度為O(log2N)

到此這篇關(guān)于C++深入細(xì)致探究二叉搜索樹的文章就介紹到這了,更多相關(guān)C++二叉搜索樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)酒店管理系統(tǒng)

    C語言實現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實現(xiàn)紅黑樹應(yīng)用實例代碼

    C++實現(xiàn)紅黑樹應(yīng)用實例代碼

    紅黑樹它一種特殊的二叉查找樹,這意味著它滿足二叉查找樹的特征,但是也有許多自己的特性,這篇文章主要給大家介紹了關(guān)于C++實現(xiàn)紅黑樹的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • C語言實現(xiàn)掃雷附完整代碼

    C語言實現(xiàn)掃雷附完整代碼

    本文詳細(xì)講解了C語言實現(xiàn)掃雷并附完整代碼,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • C++未定義行為(undefined behavior)

    C++未定義行為(undefined behavior)

    對于未定義行為,C++標(biāo)準(zhǔn)沒有明確規(guī)定編譯器們應(yīng)該怎么做,那么執(zhí)行的結(jié)果就是不可預(yù)料的。下面我們來詳細(xì)探討下
    2017-02-02
  • VC++中進(jìn)程與多進(jìn)程管理的方法詳解

    VC++中進(jìn)程與多進(jìn)程管理的方法詳解

    這篇文章主要介紹了VC++中進(jìn)程與多進(jìn)程管理的方法,以實例形式詳細(xì)分析了進(jìn)程與多進(jìn)程管理中所涉及的進(jìn)程、子進(jìn)程、進(jìn)程的互斥運行與進(jìn)程的結(jié)束等概念與具體實現(xiàn)方法,非常具有參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • C++?qsort函數(shù)排序與冒泡模擬實現(xiàn)流程詳解

    C++?qsort函數(shù)排序與冒泡模擬實現(xiàn)流程詳解

    qsort是一個庫函數(shù),基于快速排序算法實現(xiàn)的一個排序的函數(shù),下面這篇文章主要給大家介紹了關(guān)于C語言qsort()函數(shù)使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • C語言結(jié)構(gòu)體(struct)的詳細(xì)講解

    C語言結(jié)構(gòu)體(struct)的詳細(xì)講解

    C語言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • C++記錄程序運行時間的四種方法

    C++記錄程序運行時間的四種方法

    在學(xué)習(xí)過程中很重要的一個必會的小技巧:計算某一段代碼的執(zhí)行時間,可以用來分析代碼的效率和算法的時間復(fù)雜度等等(個人主要是在總結(jié)各種排序算法時遇到的這個方法),本文給大家介紹了C++記錄程序運行時間的四種方法,需要的朋友可以參考下
    2025-03-03
  • C++泛型編程函(數(shù)模板+類模板)

    C++泛型編程函(數(shù)模板+類模板)

    這篇文章主要介紹了C++泛型編程函(數(shù)模板+類模板),類模板與函數(shù)模板一樣也會經(jīng)過兩次編譯,在此文中重點區(qū)分一下類模板與模板類,函數(shù)模板與模板函數(shù)的概念,泛型編程是C++開發(fā)的一大精髓,靈活地運用泛型編程,需要的朋友可以參考一下
    2022-02-02
  • C++多線程強(qiáng)制終止詳細(xì)

    C++多線程強(qiáng)制終止詳細(xì)

    這篇文章主要介紹了C++多線程強(qiáng)制終止, 實際上,沒有任何語言或操作系統(tǒng)可以為你提供異步突然終止線程的便利,且不會警告你不要使用它們。但是下面我們再來簡單看看相關(guān)內(nèi)容吧
    2021-09-09

最新評論

扶绥县| 平遥县| 荃湾区| 乌鲁木齐县| 宜君县| 沈丘县| 科技| 彩票| 炎陵县| 客服| 兴国县| 利川市| 临沭县| 泰宁县| 梓潼县| 镇坪县| 青浦区| 承德市| 美姑县| 白河县| 南江县| 永泰县| 牟定县| 龙口市| 嫩江县| 利川市| 昂仁县| 湘潭市| 平安县| 清水县| 姚安县| 襄垣县| 乌恰县| 武川县| 射阳县| 霍林郭勒市| 宁阳县| 星子县| 柘城县| 通道| 哈密市|