<?php
/*
Binary Search tree
- Insert
- Search
- Delete
- traversals (inorder, preorder, postorder)
*/
class Node {
public $data;
public $left;
public $right;
function __construct( $key ) {
$this->data = $key;
$this->left = NULL;
$this->right = NULL;
}
}
function mostlyRightMin($root) {
if($root->left) {
$root = $root->left;
}
return $root;
}
function delete($root, $key) {
if($root == NULL) {
return $root;
} else if( $root->data > $key ){
$root->left = delete($root->left, $key);
} else if( $root->data < $key ) {
$root->right = delete($root->right, $key);
} else {
if($root->left == NULL && $root->right == NULL) {
$root = NULL;
} else if($root->left == NULL) {
$temp = $root->right;
$root = NULL;
return $temp;
} else if($root->right == NULL) {
$temp = $root->left;
$root = NULL;
return $temp;
} else if($root->left != NULL && $root->right != NULL ) {
$temp = mostlyRightMin($root->right);
$root->data = $temp->data;
$root->right = delete($root->right, $temp->data);
}
}
return $root;
}
function search($root, $key) {
if($root == NULL) {
return 0;
} else if($root->data > $key) {
return search($root->left, $key);
} else if($root->data < $key) {
return search($root->right, $key);
}
return 1;
}
function insert($root, $key) {
if($root == NULL) {
$root = new Node( $key );
$root->left = NULL;
$root->right = NULL;
} else if($root->data > $key) {
$root->left = insert($root->left, $key);
} else if($root->data < $key) {
$root->right = insert($root->right, $key);
}
return $root;
}
function inorder($root) {
if($root != NULL) {
inorder($root->left);
inorder($root->right);
}
}
function preorder($root) {
if($root != NULL) {
inorder($root->left);
inorder($root->right);
}
}
function postorder($root) {
if($root != NULL) {
inorder($root->left);
inorder($root->right);
}
}
$arrayName = array(9,8,7,11,0,5,4,3,2,1,15,-11);
echo"<pre>";
echo"</pre>";
$root = new Node(10);
foreach ($arrayName as $key => $value) {
insert($root, $value);
}
inorder($root);
printf("Search for %d: %d\n",11, search
($root, 11));
$key = 10;
delete($root, $key);
inorder($root);
?>
PD9waHAKLyoKQmluYXJ5IFNlYXJjaCB0cmVlCi0gSW5zZXJ0Ci0gU2VhcmNoCi0gRGVsZXRlCi0gdHJhdmVyc2FscyAoaW5vcmRlciwgcHJlb3JkZXIsIHBvc3RvcmRlcikKKi8KCmNsYXNzIE5vZGUgewoKICAgICAgcHVibGljICRkYXRhOwogICAgICBwdWJsaWMgJGxlZnQ7CiAgICAgIHB1YmxpYyAkcmlnaHQ7CgogICAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGtleSApIHsKCiAgICAgICAgICAkdGhpcy0+ZGF0YSA9ICRrZXk7CiAgICAgICAgICAkdGhpcy0+bGVmdCA9IE5VTEw7CiAgICAgICAgICAkdGhpcy0+cmlnaHQgPSBOVUxMOwogICAgICB9Cn0KCmZ1bmN0aW9uIG1vc3RseVJpZ2h0TWluKCRyb290KSB7CgogICAgICAgICBpZigkcm9vdC0+bGVmdCkgewoKICAgICAgICAgICAgJHJvb3QgPSAkcm9vdC0+bGVmdDsKICAgICAgICAgfQoKICAgICAgICAgcmV0dXJuICRyb290Owp9CgpmdW5jdGlvbiBkZWxldGUoJHJvb3QsICRrZXkpIHsKCiAgICAgICAgIGlmKCRyb290ID09IE5VTEwpIHsKCiAgICAgICAgICAgIHJldHVybiAkcm9vdDsKCiAgICAgICAgIH0gZWxzZSBpZiggJHJvb3QtPmRhdGEgPiAka2V5ICl7CgogICAgICAgICAgICAgJHJvb3QtPmxlZnQgPSBkZWxldGUoJHJvb3QtPmxlZnQsICRrZXkpOwoKICAgICAgICAgfSBlbHNlIGlmKCAkcm9vdC0+ZGF0YSA8ICRrZXkgKSB7CgogICAgICAgICAgICAgJHJvb3QtPnJpZ2h0ID0gZGVsZXRlKCRyb290LT5yaWdodCwgJGtleSk7CgogICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgIGlmKCRyb290LT5sZWZ0ID09IE5VTEwgJiYgJHJvb3QtPnJpZ2h0ID09IE5VTEwpIHsKCiAgICAgICAgICAgICAgICAkcm9vdCA9IE5VTEw7CgogICAgICAgICAgICAgfSBlbHNlIGlmKCRyb290LT5sZWZ0ID09IE5VTEwpIHsKCiAgICAgICAgICAgICAgICAkdGVtcCA9ICRyb290LT5yaWdodDsKCiAgICAgICAgICAgICAgICAkcm9vdCA9IE5VTEw7CgogICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wOwoKICAgICAgICAgICAgIH0gZWxzZSBpZigkcm9vdC0+cmlnaHQgPT0gTlVMTCkgewoKICAgICAgICAgICAgICAgJHRlbXAgPSAkcm9vdC0+bGVmdDsKCiAgICAgICAgICAgICAgICRyb290ID0gTlVMTDsKCiAgICAgICAgICAgICAgIHJldHVybiAkdGVtcDsKCiAgICAgICAgICAgICB9IGVsc2UgaWYoJHJvb3QtPmxlZnQgIT0gTlVMTCAmJiAkcm9vdC0+cmlnaHQgIT0gTlVMTCApIHsKCiAgICAgICAgICAgICAgICR0ZW1wID0gbW9zdGx5UmlnaHRNaW4oJHJvb3QtPnJpZ2h0KTsKCiAgICAgICAgICAgICAgICRyb290LT5kYXRhID0gJHRlbXAtPmRhdGE7CgogICAgICAgICAgICAgICAkcm9vdC0+cmlnaHQgPSBkZWxldGUoJHJvb3QtPnJpZ2h0LCAkdGVtcC0+ZGF0YSk7CiAgICAgICAgICAgICB9CgogICAgICAgICB9CgogICAgICAgICByZXR1cm4gJHJvb3Q7Cn0KCmZ1bmN0aW9uIHNlYXJjaCgkcm9vdCwgJGtleSkgewoKICAgICAgICAgaWYoJHJvb3QgPT0gTlVMTCkgewogICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9IGVsc2UgaWYoJHJvb3QtPmRhdGEgPiAka2V5KSB7CiAgICAgICAgICAgIHJldHVybiBzZWFyY2goJHJvb3QtPmxlZnQsICRrZXkpOwogICAgICAgICB9IGVsc2UgaWYoJHJvb3QtPmRhdGEgPCAka2V5KSB7CiAgICAgICAgICAgIHJldHVybiBzZWFyY2goJHJvb3QtPnJpZ2h0LCAka2V5KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMTsKfQoKZnVuY3Rpb24gaW5zZXJ0KCRyb290LCAka2V5KSB7CgogICAgICAgICBpZigkcm9vdCA9PSBOVUxMKSB7CgogICAgICAgICAgICAkcm9vdCA9IG5ldyBOb2RlKCAka2V5ICk7CgogICAgICAgICAgICAkcm9vdC0+bGVmdCA9IE5VTEw7CgogICAgICAgICAgICAkcm9vdC0+cmlnaHQgPSBOVUxMOwoKICAgICAgICAgfSBlbHNlIGlmKCRyb290LT5kYXRhID4gJGtleSkgewoKICAgICAgICAgICAgJHJvb3QtPmxlZnQgPSBpbnNlcnQoJHJvb3QtPmxlZnQsICRrZXkpOwoKICAgICAgICAgfSBlbHNlIGlmKCRyb290LT5kYXRhIDwgJGtleSkgewoKICAgICAgICAgICAgJHJvb3QtPnJpZ2h0ID0gaW5zZXJ0KCRyb290LT5yaWdodCwgJGtleSk7CiAgICAgICAgIH0KCiAgICAgICAgIHJldHVybiAkcm9vdDsKfQoKZnVuY3Rpb24gaW5vcmRlcigkcm9vdCkgewoKICAgIGlmKCRyb290ICE9IE5VTEwpIHsKCiAgICAgIGlub3JkZXIoJHJvb3QtPmxlZnQpOwoKICAgICAgcHJpbnRmKCIlZCAiLCAkcm9vdC0+ZGF0YSk7CgogICAgICBpbm9yZGVyKCRyb290LT5yaWdodCk7CiAgICB9Cn0KCmZ1bmN0aW9uIHByZW9yZGVyKCRyb290KSB7CgogICAgaWYoJHJvb3QgIT0gTlVMTCkgewoKICAgICAgcHJpbnRmKCIlZCAiLCAkcm9vdC0+ZGF0YSk7CgogICAgICBpbm9yZGVyKCRyb290LT5sZWZ0KTsKCiAgICAgIGlub3JkZXIoJHJvb3QtPnJpZ2h0KTsKICAgIH0KfQoKZnVuY3Rpb24gcG9zdG9yZGVyKCRyb290KSB7CgogICAgaWYoJHJvb3QgIT0gTlVMTCkgewoKICAgICAgaW5vcmRlcigkcm9vdC0+bGVmdCk7CgogICAgICBpbm9yZGVyKCRyb290LT5yaWdodCk7CgogICAgICBwcmludGYoIiVkICIsICRyb290LT5kYXRhKTsKICAgIH0KfQoKJGFycmF5TmFtZSA9IGFycmF5KDksOCw3LDExLDAsNSw0LDMsMiwxLDE1LC0xMSk7CgplY2hvIjxwcmU+IjsKCnByaW50X3IoICRhcnJheU5hbWUgKTsKCmVjaG8iPC9wcmU+IjsKCiRyb290ID0gbmV3IE5vZGUoMTApOwoKZm9yZWFjaCAoJGFycmF5TmFtZSBhcyAka2V5ID0+ICR2YWx1ZSkgewoKICAgICAgICAgaW5zZXJ0KCRyb290LCAkdmFsdWUpOwp9Cgppbm9yZGVyKCRyb290KTsKCnByaW50ZigiU2VhcmNoIGZvciAlZDogJWRcbiIsMTEsIHNlYXJjaCgkcm9vdCwgMTEpKTsKCiRrZXkgPSAxMDsKCnByaW50ZigiRGVsZXRlZDogJWRcbiIsJGtleSk7CgpkZWxldGUoJHJvb3QsICRrZXkpOwoKaW5vcmRlcigkcm9vdCk7Cj8+Cg==