日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉排序树(搜索树BST)-详解结点的删除

發布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉排序树(搜索树BST)-详解结点的删除 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在二叉排序樹中刪除一個結點時,需保證刪除后的二叉樹仍然是二叉排序樹。為討論方便,假定被刪除結點為p,其雙親結點為f。刪除的過程可按下述的兩種情況分別處理。
在這里我們用紅色三角形表示我們要刪除的結點,藍色表示我們要改變指針的指向,如果藍色是圓圈,則說明是新根。
(1)如果被刪除的結點沒有左子樹,則只需把結點f指向p的指針改為指向p的右子樹。
情況一:

情況二:

情況三:

(2)如果被刪除的結點p有左子樹,則刪除結點p時,從結點p的左子樹中選擇結點值最大的結點s(其實就是p的左子樹中最右下角的結點,該結點s可能有左子樹,但右子樹一定為空),用結點s替換結點p(把s的數據復制到p中),再將指向結點s的指針改為指向結點s的左子樹即可。

情況一:

情況二:

代碼如下:

bool BinSTree::BSTreeDelete(BinSTreeNode *&bt, KeyType k) {BinSTreeNode *f, *p, *q, *s;p = bt;f = nullptr;while (p && p->key != k){f = p;if (p->key > k) p = p->lchild;else p = p->rchild;}if (p == nullptr) return false;if (p->lchild == nullptr)//(1){if (f == nullptr) bt = p->rchild;//情況一else if (f->lchild == p) f->lchild = p->rchild;//情況二else f->rchild = p->rchild;//情況三delete p;return true;}else//(2){q = p;s = p->lchild;while (s->rchild){q = s;s = s->rchild;}if (q == p) q->lchild = s->lchild;//情況一else q->rchild = s->lchild;//情況二p->key = s->key;delete s;return true;} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的二叉排序树(搜索树BST)-详解结点的删除的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。