Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d51468f

Browse files
Add delete-node-in-a-bst solution
1 parent 1b060af commit d51468f

File tree

3 files changed

+106
-11
lines changed

3 files changed

+106
-11
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace leetcode;
6+
7+
use leetcode\util\TreeNode;
8+
9+
class DeleteNodeInABinarySearchTree
10+
{
11+
public static function deleteNode(?TreeNode $root, int $key): ?TreeNode
12+
{
13+
if (!$root) {
14+
return $root;
15+
}
16+
if ($root->val > $key) {
17+
$root->left = self::deleteNode($root->left, $key);
18+
} elseif ($root->val < $key) {
19+
$root->right = self::deleteNode($root->right, $key);
20+
} else {
21+
if (!$root->left) {
22+
return $root->right ?? new TreeNode();
23+
}
24+
if (!$root->right) {
25+
return $root->left ?? new TreeNode();
26+
}
27+
$node = self::findMinNode($root->right);
28+
$root->val = $node->val;
29+
$root->right = self::deleteNode($root->right, $node->val);
30+
}
31+
32+
return $root;
33+
}
34+
35+
private static function findMinNode(?TreeNode $node): TreeNode
36+
{
37+
while (!$node) {
38+
$node = $node->left;
39+
}
40+
return $node;
41+
}
42+
}

β€Žsrc/leetcode/util/TreeNode.phpβ€Ž

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,24 @@ public static function dfsTreeValues(TreeNode $tree, array &$list): void
3030

3131
public static function bfsTreeValues(TreeNode $tree): array
3232
{
33-
$result = $queue = [];
34-
$queue[] = $tree;
33+
$ans = $items = $queue = [];
34+
$queue = [$tree];
3535
while ($queue) {
36-
/** @var TreeNode $current */
37-
$current = array_pop($queue);
38-
$result[] = $current->val;
39-
if ($current->right) {
40-
$queue[] = $current->right;
41-
}
36+
/** @var TreeNode $node */
37+
$node = array_shift($queue);
38+
if ($node instanceof TreeNode) {
39+
array_push($ans, $node->val ?: null);
40+
if ($node->left) {
41+
array_push($queue, $node->left);
42+
}
4243

43-
if ($current->left) {
44-
$queue[] = $current->left;
44+
if ($node->right) {
45+
array_push($queue, $node->right);
46+
}
4547
}
4648
}
4749

48-
return $result;
50+
return $ans;
4951
}
5052

5153
public static function fromArray(array $array): ?TreeNode
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace leetcode\tests;
6+
7+
use leetcode\DeleteNodeInABinarySearchTree;
8+
use PHPUnit\Framework\TestCase;
9+
use leetcode\util\TreeNode;
10+
11+
class DeleteNodeInABinarySearchTreeTest extends TestCase
12+
{
13+
private TreeNode $p;
14+
private TreeNode $q;
15+
private ?TreeNode $t;
16+
17+
protected function setUp(): void
18+
{
19+
$this->p = new TreeNode(5);
20+
$this->p->left = new TreeNode(3);
21+
$this->p->right = new TreeNode(6);
22+
$this->p->left->left = new TreeNode(2);
23+
$this->p->left->right = new TreeNode(4);
24+
$this->p->right->left = new TreeNode();
25+
$this->p->right->right = new TreeNode(7);
26+
27+
$this->q = new TreeNode(5);
28+
$this->q->left = new TreeNode(3);
29+
$this->q->right = new TreeNode(6);
30+
$this->q->left->left = new TreeNode(2);
31+
$this->q->left->right = new TreeNode(4);
32+
$this->q->right->left = new TreeNode();
33+
$this->q->right->right = new TreeNode(7);
34+
35+
$this->t = null;
36+
}
37+
38+
public function testDeleteNode(): void
39+
{
40+
$node1 = DeleteNodeInABinarySearchTree::deleteNode($this->p, 3);
41+
self::assertSame([5, 4, 6, 2, null, null, 7], TreeNode::bfsTreeValues($node1));
42+
43+
$node2 = DeleteNodeInABinarySearchTree::deleteNode($this->q, 0);
44+
self::assertSame([5, 3, 6, 2, 4, null, 7], TreeNode::bfsTreeValues($node2));
45+
46+
$node3 = DeleteNodeInABinarySearchTree::deleteNode($this->t, 0);
47+
if (!$node3 instanceof TreeNode) {
48+
self::assertSame([], (array) $node3);
49+
}
50+
}
51+
}

0 commit comments

Comments
(0)

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /