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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java 递归从子节点删除父节点_LeetCode450. 删除二叉搜索树中的节点

發布時間:2023/12/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 递归从子节点删除父节点_LeetCode450. 删除二叉搜索树中的节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

刪除一個二叉搜索樹中的節點,需要進行情況的分類討論,看一下將這個節點刪除之后是否需要對二叉搜索樹進行調整(為了保持樹的連接和維持二叉搜索樹的性質)。

(1)如果刪除的是一個葉子節點,那問題不大,因為它沒有左子樹和右子樹,直接返回NULL就行了,表示它沒了。

(2)如果要刪除的節點,左右子樹都存在,那麻煩了,刪除這個節點是需要進行調整的,刪除的這個節點可以用它左子樹的最大值或者右子樹的最小值來替代(為了 維持二叉搜索樹的性質),這里我們用右子樹的最小值來代替這個被刪除的最小值。然后遞歸地到右子樹刪除那個原來右子樹中的最小值(因為它已經滾到那個被刪除的節點上了)。

(3)如果要刪除的節點左子樹不存在,那我們直接讓這個被刪除的節點的父節點的右指針指向被刪除節點的右孩子就好了。也就是跳過了這個被刪除的節點,表示這個節點被刪除了。 這一步操作直接用root = root -> right;就可以完成。

(4)如果被刪除的節點右子樹不存在,那就類似(3),直接用root = root -> left;表示將被刪除的節點的父節點的左指針指向被刪除節點的左孩子,表示將這個節點刪除。

代碼如下:

/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/ class Solution { public:TreeNode* findSmallest(TreeNode* root) { // 找到以root為根的樹中的最小值,這個函數是為了在刪除某個節點且這個節點右子樹不為空時,找到右子樹中的最小值if(root == NULL) { return NULL;} else if(root -> left != NULL) { // 如果左子樹不為空,這最小值在左子樹中,遞歸地去左子樹中尋找最小值return findSmallest(root -> left);}return root; // 如果左子樹為空,這最小值就是root,這是由二叉搜索樹的性質決定的}TreeNode* deleteNode(TreeNode* root, int key) {if(root == NULL) {return NULL;} else if(key < root -> val) { // 要刪除的值小于根節點的值,遞歸地到左子樹中刪除這個節點root -> left = deleteNode(root -> left, key);} else if(key > root -> val) { // 要刪除的值大于根節點的值,遞歸地到右子樹中刪除這個節點root -> right = deleteNode(root -> right, key);} else {if(root -> left == NULL && root -> right == NULL) { // 如果被刪除的節點是葉節點,直接刪除這個節點,返回NULL即可return NULL;} else if(root -> left != NULL && root -> right != NULL) { // 如果被刪除的節點左、右子樹都不為空TreeNode* temp = findSmallest(root -> right); // 那就找到右子樹中最小的值(也就是被刪除的節點的中序后繼),用這個節點代替被刪除的節點root -> val = temp -> val; root -> right = deleteNode(root -> right, root -> val); // 然后遞歸地到右子樹中刪除這個節點} else if(root -> left != NULL) { // 如果左子樹不為空,這直接連接被刪除的節點的父節點的左指針到這個左子樹上root = root -> left;} else if(root -> right != NULL) { // 右子樹不為空時同理root = root -> right;}}return root;} };

總結

以上是生活随笔為你收集整理的java 递归从子节点删除父节点_LeetCode450. 删除二叉搜索树中的节点的全部內容,希望文章能夠幫你解決所遇到的問題。

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