在二叉搜尋樹中實現刪除操作(failed)
阿新 • • 發佈:2018-12-10
給定一個二叉搜尋樹的根節點 root 和一個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹(有可能被更新)的根節點的引用。
一般來說,刪除節點可分為兩個步驟:
- 首先找到需要刪除的節點;
- 如果找到了,刪除它。
說明: 要求演算法時間複雜度為 O(h),h 為樹的高度。
示例:
root = [5,3,6,2,4,null,7] key = 3 5 / \ 3 6 / \ \ 2 4 7 給定需要刪除的節點值是 3,所以我們首先找到 3 這個節點,然後刪除它。 一個正確的答案是 [5,4,6,2,null,null,7], 如下圖所示。 5 / \ 4 6 / \ 2 7 另一個正確答案是 [5,2,6,null,4,null,7]。 5 / \ 2 6 \ \ 4 7
方法是
2. 如果要刪除的節點有右孩子, 則可以讓右孩子替換其位置, 並且讓右孩子的左子樹連線到要刪除節點的左孩子的最右端
以後再寫一次吧ORZ
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* deleteNode(TreeNode* root, int key) { if(!root) return root; if(root->val > key){ root->left = deleteNode(root->left, key); return root; } else if(root->val < key){ root->right = deleteNode(root->right, key); return root; } TreeNode* left = root->left, *right = root->right, *tem = left; delete root; if(!left || !right) return left?left: right; while(tem->right) tem = tem->right; tem->right = right->left, right->left = left; return right; } };