@@ -100,35 +100,65 @@ tags:
100
100
101
101
<!-- tabs:start -->
102
102
103
- #### Python3
104
-
105
- ``` python
106
- # Definition for a binary tree node.
107
- # class TreeNode:
108
- # def __init__(self, val=0, left=None, right=None):
109
- # self.val = val
110
- # self.left = left
111
- # self.right = right
112
- class Solution :
113
- def deleteNode (self , root : Optional[TreeNode], key : int ) -> Optional[TreeNode]:
114
- if root is None :
115
- return None
116
- if root.val > key:
117
- root.left = self .deleteNode(root.left, key)
118
- return root
119
- if root.val < key:
120
- root.right = self .deleteNode(root.right, key)
121
- return root
122
- if root.left is None :
123
- return root.right
124
- if root.right is None :
125
- return root.left
126
- node = root.right
127
- while node.left:
128
- node = node.left
129
- node.left = root.left
130
- root = root.right
131
- return root
103
+ #### java iteration
104
+
105
+ ``` java 1
106
+ /**
107
+ * Definition for a binary tree node.
108
+ * public class TreeNode {
109
+ * int val;
110
+ * TreeNode left;
111
+ * TreeNode right;
112
+ * TreeNode() {}
113
+ * TreeNode(int val) { this.val = val; }
114
+ * TreeNode(int val, TreeNode left, TreeNode right) {
115
+ * this.val = val;
116
+ * this.left = left;
117
+ * this.right = right;
118
+ * }
119
+ * }
120
+ */
121
+ class Solution {
122
+ public TreeNode deleteNode (TreeNode root , int key ) {
123
+ if (root == null ) return null ;
124
+ if (root. val == key) return helper(root);
125
+
126
+ TreeNode dummy = root;
127
+ while (root != null ) {
128
+ if (root. val > key) {
129
+ if (root. left != null && root. left. val == key) {
130
+ root. left = helper(root. left);
131
+ break ;
132
+ } else {
133
+ root = root. left;
134
+ }
135
+ } else {
136
+ if (root. right != null && root. right. val == key) {
137
+ root. right = helper(root. right);
138
+ break ;
139
+ } else {
140
+ root = root. right;
141
+ }
142
+ }
143
+ }
144
+ return dummy;
145
+ }
146
+
147
+ private TreeNode helper (TreeNode root ) {
148
+ if (root. left == null ) return root. right;
149
+ if (root. right == null ) return root. left;
150
+
151
+ TreeNode rightChild = root. right;
152
+ TreeNode lastRight = findLastRight(root. left);
153
+ lastRight. right = rightChild;
154
+ return root. left;
155
+ }
156
+
157
+ private TreeNode findLastRight (TreeNode root ) {
158
+ if (root. right == null ) return root;
159
+ return findLastRight(root. right);
160
+ }
161
+ }
132
162
```
133
163
134
164
#### Java
@@ -179,208 +209,6 @@ class Solution {
179
209
}
180
210
```
181
211
182
- #### C++
183
-
184
- ``` cpp
185
- /* *
186
- * Definition for a binary tree node.
187
- * struct TreeNode {
188
- * int val;
189
- * TreeNode *left;
190
- * TreeNode *right;
191
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
192
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
193
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
194
- * };
195
- */
196
- class Solution {
197
- public:
198
- TreeNode* deleteNode(TreeNode* root, int key) {
199
- if (!root) return root;
200
- if (root->val > key) {
201
- root->left = deleteNode(root->left, key);
202
- return root;
203
- }
204
- if (root->val < key) {
205
- root->right = deleteNode(root->right, key);
206
- return root;
207
- }
208
- if (!root->left) return root->right;
209
- if (!root->right) return root->left;
210
- TreeNode* node = root->right;
211
- while (node->left) node = node->left;
212
- node->left = root->left;
213
- root = root->right;
214
- return root;
215
- }
216
- };
217
- ```
218
-
219
- #### Go
220
-
221
- ```go
222
- /**
223
- * Definition for a binary tree node.
224
- * type TreeNode struct {
225
- * Val int
226
- * Left *TreeNode
227
- * Right *TreeNode
228
- * }
229
- */
230
- func deleteNode(root *TreeNode, key int) *TreeNode {
231
- if root == nil {
232
- return nil
233
- }
234
- if root.Val > key {
235
- root.Left = deleteNode(root.Left, key)
236
- return root
237
- }
238
- if root.Val < key {
239
- root.Right = deleteNode(root.Right, key)
240
- return root
241
- }
242
- if root.Left == nil {
243
- return root.Right
244
- }
245
- if root.Right == nil {
246
- return root.Left
247
- }
248
- node := root.Right
249
- for node.Left != nil {
250
- node = node.Left
251
- }
252
- node.Left = root.Left
253
- root = root.Right
254
- return root
255
- }
256
- ```
257
-
258
- #### TypeScript
259
-
260
- ``` ts
261
- /**
262
- * Definition for a binary tree node.
263
- * class TreeNode {
264
- * val: number
265
- * left: TreeNode | null
266
- * right: TreeNode | null
267
- * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
268
- * this.val = (val===undefined ? 0 : val)
269
- * this.left = (left===undefined ? null : left)
270
- * this.right = (right===undefined ? null : right)
271
- * }
272
- * }
273
- */
274
-
275
- function deleteNode(root : TreeNode | null , key : number ): TreeNode | null {
276
- if (root == null ) {
277
- return root ;
278
- }
279
- const { val, left, right } = root ;
280
- if (val > key ) {
281
- root .left = deleteNode (left , key );
282
- } else if (val < key ) {
283
- root .right = deleteNode (right , key );
284
- } else {
285
- if (left == null && right == null ) {
286
- root = null ;
287
- } else if (left == null || right == null ) {
288
- root = left || right ;
289
- } else {
290
- if (right .left == null ) {
291
- right .left = left ;
292
- root = right ;
293
- } else {
294
- let minPreNode = right ;
295
- while (minPreNode .left .left != null ) {
296
- minPreNode = minPreNode .left ;
297
- }
298
- const minVal = minPreNode .left .val ;
299
- root .val = minVal ;
300
- minPreNode .left = deleteNode (minPreNode .left , minVal );
301
- }
302
- }
303
- }
304
- return root ;
305
- }
306
- ```
307
-
308
- #### Rust
309
-
310
- ``` rust
311
- // Definition for a binary tree node.
312
- // #[derive(Debug, PartialEq, Eq)]
313
- // pub struct TreeNode {
314
- // pub val: i32,
315
- // pub left: Option<Rc<RefCell<TreeNode>>>,
316
- // pub right: Option<Rc<RefCell<TreeNode>>>,
317
- // }
318
- //
319
- // impl TreeNode {
320
- // #[inline]
321
- // pub fn new(val: i32) -> Self {
322
- // TreeNode {
323
- // val,
324
- // left: None,
325
- // right: None
326
- // }
327
- // }
328
- // }
329
- use std :: cell :: RefCell ;
330
- use std :: rc :: Rc ;
331
- impl Solution {
332
- fn dfs (root : & Option <Rc <RefCell <TreeNode >>>) -> i32 {
333
- let node = root . as_ref (). unwrap (). borrow ();
334
- if node . left. is_none () {
335
- return node . val;
336
- }
337
- Self :: dfs (& node . left)
338
- }
339
-
340
- pub fn delete_node (
341
- mut root : Option <Rc <RefCell <TreeNode >>>,
342
- key : i32 ,
343
- ) -> Option <Rc <RefCell <TreeNode >>> {
344
- if root . is_some () {
345
- let mut node = root . as_mut (). unwrap (). borrow_mut ();
346
- match node . val. cmp (& key ) {
347
- std :: cmp :: Ordering :: Less => {
348
- node . right = Self :: delete_node (node . right. take (), key );
349
- }
350
- std :: cmp :: Ordering :: Greater => {
351
- node . left = Self :: delete_node (node . left. take (), key );
352
- }
353
- std :: cmp :: Ordering :: Equal => {
354
- match (node . left. is_some (), node . right. is_some ()) {
355
- (false , false ) => {
356
- return None ;
357
- }
358
- (true , false ) => {
359
- return node . left. take ();
360
- }
361
- (false , true ) => {
362
- return node . right. take ();
363
- }
364
- (true , true ) => {
365
- if node . right. as_ref (). unwrap (). borrow (). left. is_none () {
366
- let mut r = node . right. take ();
367
- r . as_mut (). unwrap (). borrow_mut (). left = node . left. take ();
368
- return r ;
369
- } else {
370
- let val = Self :: dfs (& node . right);
371
- node . val = val ;
372
- node . right = Self :: delete_node (node . right. take (), val );
373
- }
374
- }
375
- };
376
- }
377
- }
378
- }
379
- root
380
- }
381
- }
382
- ```
383
-
384
212
<!-- tabs:end -->
385
213
386
214
<!-- solution:end -->
0 commit comments