-
Notifications
You must be signed in to change notification settings - Fork 117
Expand file tree
/
Copy pathDeleteNodeInABST450.java
More file actions
135 lines (114 loc) · 3.07 KB
/
DeleteNodeInABST450.java
File metadata and controls
135 lines (114 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/**
* Given a root node reference of a BST and a key, delete the node with the given
* key in the BST. Return the root node reference (possibly updated) of the BST.
*
* Basically, the deletion can be divided into two stages:
*
* Search for a node to remove.
* If the node is found, delete the node.
* Note: Time complexity should be O(height of tree).
*
* Example:
*
* root = [5,3,6,2,4,null,7]
* key = 3
*
* 5
* / \
* 3 6
* / \ \
* 2 4 7
*
* Given key to delete is 3. So we find the node with value 3 and delete it.
*
* One valid answer is [5,4,6,2,null,null,7], shown in the following BST.
*
* 5
* / \
* 4 6
* / \
* 2 7
*
* Another valid answer is [5,2,6,null,4,null,7].
*
* 5
* / \
* 2 6
* \ \
* 4 7
*
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class DeleteNodeInABST450 {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) return null;
if (key < root.val) {
root.left = deleteNode(root.left, key);
return root;
}
if (key > root.val) {
root.right = deleteNode(root.right, key);
return root;
}
return delete(root);
}
private TreeNode delete(TreeNode node) {
if (node.left == null) return node.right;
if (node.right == null) return node.left;
return moveNext(node);
}
private TreeNode moveNext(TreeNode node) {
TreeNode min = node.right;
if (min.left == null) {
node.val = min.val;
node.right = min.right;
return node;
}
while (min.left != null && min.left.left != null) {
System.out.println(min.val);
min = min.left;
}
node.val = min.left.val;
min.left = delete(min.left);
return node;
}
public TreeNode deleteNode2(TreeNode root, int key) {
/* Base Case: If the tree is empty */
if (root == null) return root;
/* Otherwise, recur down the tree */
if (key < root.val) {
root.left = deleteNode(root.left, key);
} else if (key > root.val) {
root.right = deleteNode(root.right, key);
} else {
// node with only one child or no child
if (root.left == null) {
return root.right;
} else if (root.right == null) {
return root.left;
}
// node with two children: Get the inorder successor (smallest
// in the right subtree)
root.val = minValue(root.right);
// Delete the inorder successor
root.right = deleteNode(root.right, root.val);
}
return root;
}
private int minValue(TreeNode root) {
int minv = root.val;
while (root.left != null) {
minv = root.left.val;
root = root.left;
}
return minv;
}
}