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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 450. 删除二叉搜索树中的节点 c语言实现

發(fā)布時(shí)間:2025/4/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 450. 删除二叉搜索树中的节点 c语言实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如題:

給定一個(gè)二叉搜索樹的根節(jié)點(diǎn) root 和一個(gè)值 key,刪除二叉搜索樹中的 key 對(duì)應(yīng)的節(jié)點(diǎn),并保證二叉搜索樹的性質(zhì)不變。返回二叉搜索樹(有可能被更新)的根節(jié)點(diǎn)的引用。 一般來說,刪除節(jié)點(diǎn)可分為兩個(gè)步驟: 首先找到需要?jiǎng)h除的節(jié)點(diǎn); 如果找到了,刪除它。 說明: 要求算法時(shí)間復(fù)雜度為 O(h),h 為樹的高度。示例: root = [5,3,6,2,4,null,7] key = 35/ \3 6/ \ \ 2 4 7給定需要?jiǎng)h除的節(jié)點(diǎn)值是 3,所以我們首先找到 3 這個(gè)節(jié)點(diǎn),然后刪除它。 一個(gè)正確的答案是 [5,4,6,2,null,null,7], 如下圖所示。5/ \4 6/ \ 2 7 另一個(gè)正確答案是 [5,2,6,null,4,null,7]。5/ \2 6\ \4 7

簡單說就是二叉搜索樹的刪除操作,難度為中等,這個(gè)是二叉搜索樹的基本操作,掌握了就很簡單了。

刪除一個(gè)節(jié)點(diǎn)后要保持原有二叉樹性質(zhì),根據(jù)節(jié)點(diǎn)自身的情況有三種情況需要處理

如果節(jié)點(diǎn)沒有左右子樹,則可以直接刪除。
如果節(jié)點(diǎn)只有左子樹或者右子樹,則可以直接讓子樹替代自己。
如果同時(shí)存在左右節(jié)點(diǎn),我們知道中序遍歷二叉樹得到有序數(shù)列,這時(shí)候有兩種操作方式,一種是使用直接前驅(qū)替代待刪節(jié)點(diǎn),一種是使用直接后繼替代待刪節(jié)點(diǎn)。兩種方式操作邏輯一致,僅僅方向不同。
3.1 設(shè)待刪節(jié)點(diǎn)為delte, 如果采用直接前驅(qū)替代,這時(shí)候搜索節(jié)點(diǎn)左子樹最右邊的點(diǎn)s(s沒有右子樹),這時(shí)候有兩種情況,一種是s本身就是待刪節(jié)點(diǎn)的左子樹,即s的父節(jié)點(diǎn)等于delte,這時(shí)候令

delte->left = s->left;delte->val = s->val;即可。

如果s的父節(jié)點(diǎn)p不等于delte,這時(shí)候需要將s的左子樹變?yōu)閜的右子樹即可。
整個(gè)代碼也比較簡單理解:

//直接前驅(qū)替代 p = delte; s = delte->left; while (s->right){p = s; s = s->right;} dlete->val = s->val; if (p == delte) delte->left = s->left; else p->right = s->left; free(s);

如果使用直接后繼替代delte的話,這時(shí)候是搜索delte的右子樹中最左邊的元素s,同樣存在兩種情況,s的父節(jié)點(diǎn)p等于delte或者不等于,處理上和直接前驅(qū)類似。

//直接后繼替代 p = delte; s = delte->right; while (s->left){p = s; s = s->left;} dlete->val = s->val; if (p == delte) delte->right = s->right; else p->left = s->right; free(s);

下面是直接后繼替代的代碼:

/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/struct TreeNode* deleteBST(struct TreeNode* delte) {struct TreeNode *p, *t;if (!delte->right){//只有左孩子的情況t = delte; delte = delte->left;}else if (!delte->left){//只有右孩子的情況 t = delte; delte = delte->right; }else{//左右孩子都有,從右子樹搜索其直接后繼,即最左邊的元素p = delte; t = p->right;while (t->left){p = t; t = t->left;}delte->val = t->val;if (p == delte)delte->right = t->right;elsep->left = t->right;}free(t);return delte; }struct TreeNode* deleteNode(struct TreeNode* root, int key){if (!root) return root;if (root->val == key)root = deleteBST(root);else if (root->val > key)root->left = deleteNode(root->left, key);elseroot->right = deleteNode(root->right, key);return root; }

參考資料:

1.?數(shù)據(jù)結(jié)構(gòu)?: C語言版/ 嚴(yán)蔚敏,吳偉民編著

2. 算法導(dǎo)論

=============================================================================================

Linux應(yīng)用程序、內(nèi)核、驅(qū)動(dòng)開發(fā)交流討論群(745510310),感興趣的同學(xué)可以加群討論、交流、資料查找等,前進(jìn)的道路上,你不是一個(gè)人奧^_^。

總結(jié)

以上是生活随笔為你收集整理的leetcode 450. 删除二叉搜索树中的节点 c语言实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。