二叉搜尋樹的插入與刪除 詳細解析

2022-10-04 04:54:08 字數 1851 閱讀 6198

題目:建立乙個程式設計客棧類,類中的資料成員時一棵二叉搜尋樹,對外提供的介面有新增結點和刪除結點這兩種方法。使用者不關注二叉樹的情況。要求我們給出這個類的結構以及實現類中的方法。

思路新增結點:

新增結點其實很容易,我們只需要找到結點所行對應的位置就可以了,而且沒有要求是平衡的二叉搜尋樹,因此每次新增結點都是在葉子結點上操作,不需要修改二叉搜尋樹整體的結構。要找出新增節點在二叉搜尋樹中的位置,可以用乙個迴圈解決。判斷插入結點與當前頭結點的大小,如果大於頭結點則繼續搜尋右子樹,如果小於頭結點則繼續搜尋左子樹。直到搜尋到葉子結點,此時進行插入結點操作。如果插入的結點等於二叉搜尋樹中當前某一結點的值,那麼退出插入操作,並告知使用者該結點已經存在。

刪除結點:

刪除結點比較麻煩,因為需要調整樹的結構,這是因為刪除結點並不一定發生在葉子結點。如果刪除的是葉子結點,那麼操作非常簡單,只是做相應的刪除就可以了,但如果刪除的是非葉子結點,那麼就需要調整二叉搜尋樹的結構。調整的策略有兩個。假設當前需要刪除的結點為a,

1.找出a結點左子樹中的最大值結點b,將b調整到原先a的位置。

2.找出a結點右子樹中的最小值結點c,將c調整到原先a的位置。

這其中涉及到許多複雜的指標操作,在下面的**示例中並沒有完成結點刪除操作,等有空再補充研究一下。

**示例

複製** **如下:

#include

#include

#include

using namespace std;

//二叉樹結點

struct binarytreenode

;class bst

;//建構函式

bst::bst(int value)

//析構函式

bst::~bst()

//建立二叉樹結點

binarytreenode* bst::createbinarytreenode(int value)

//求二叉搜尋樹最大值

binarytreenode* bst::getmaxnode(binarytreenode* pnode)

return pnode;

}//求二叉搜尋樹最小值

binarytreenode* bst::getminnode(binarytreenode* pnode)

return pnode;

}//二叉搜尋樹新增結點

void bst::addnode(int value)

//尋找結點插入的位置,如果待插入結點小於當前頭結點,則繼續搜尋左子樹

else if(pnode->m_nvalue > value)

else//否則繼續遍歷其左子樹

pnode=pnode->m_pleft;

}//思路跟上述相同

else if(pnode->m_nvalue < value)程式設計客棧

pnode=pnode->m_pright;}}

}//未完成

void bst::deletenode(int value)

else if(proot->m_pright!=null)

else

}if(pnode->m_nvalue==value)

else if(pnode->m_pright!=null)

else}}

}void bst::inorderprinttree(binarytreenode* proot)//中序遍歷

else

}//因為需要使用遞迴來進行中序遍歷,所以還需要呼叫乙個帶引數的中序遍歷函式

void bst::inorderprinttree()//中序遍歷

void main()

本文標題: 二叉搜尋樹的插入與刪除(詳細解析)

本文位址:

二叉搜尋樹的插入與刪除

插入 bstree insert bstree bst,elementtype x else return bst 刪除 bstree delete bstree bst,element x else return bst 總結 二叉樹的插入比較好解決,只需要簡單的遞迴判斷即可。麻煩一點的是二叉樹的...

二叉搜尋樹的插入與刪除

題目 建立乙個類,類中的資料成員時一棵二叉搜尋樹,對外提供的介面有新增結點和刪除結點這兩種方法。使用者不關注二叉樹的情況。要求我們給出這個類的結構以及實現類中的方法。刪除結點比較麻煩,因為需要調整樹的結構,這是因為刪除結點並不一定發生在葉子結點。如果刪除的是葉子結點,那麼操作非常簡單,只是做相應的刪...

二叉搜尋樹的插入與刪除

題目 建立乙個類,類中的資料成員時一棵二叉搜尋樹,對外提供的介面有新增結點和刪除結點這兩種方法。使用者不關注二叉樹的情況。要求我們給出這個類的結構以及實現類中的方法。刪除結點比較麻煩,因為需要調整樹的結構,這是因為刪除結點並不一定發生在葉子結點。如果刪除的是葉子結點,那麼操作非常簡單,只是做相應的刪...