AVL树是一种自平衡的二叉搜索树,它通过在插入和删除节点时进行旋转操作来保持树的平衡。本文将提供一个PHP实现的AVL树的实例,包括树的创建、插入、删除和搜索等基本操作。

实例代码

```php

实例php avl,PHPAVL树实例教程:实现与使用AVL平衡二叉搜索树  第1张

class AVLNode {

public $key;

public $left;

public $right;

public $height;

public function __construct($key) {

$this->key = $key;

$this->left = null;

$this->right = null;

$this->height = 1;

}

}

class AVLTree {

private $root;

public function insert($key) {

$this->root = $this->insertNode($this->root, $key);

}

private function insertNode($node, $key) {

if ($node === null) {

return new AVLNode($key);

}

if ($key < $node->key) {

$node->left = $this->insertNode($node->left, $key);

} else if ($key > $node->key) {

$node->right = $this->insertNode($node->right, $key);

} else {

return $node;

}

$node->height = 1 + max($this->getHeight($node->left), $this->getHeight($node->right));

$balance = $this->getBalance($node);

if ($balance > 1 && $key < $node->left->key) {

return $this->rightRotate($node);

}

if ($balance < -1 && $key > $node->right->key) {

return $this->leftRotate($node);

}

if ($balance > 1 && $key > $node->left->key) {

$node->left = $this->leftRotate($node->left);

return $this->rightRotate($node);

}

if ($balance < -1 && $key < $node->right->key) {

$node->right = $this->rightRotate($node->right);

return $this->leftRotate($node);

}

return $node;

}

private function leftRotate($y) {

$x = $y->right;

$T2 = $x->left;

$x->left = $y;

$y->right = $T2;

$y->height = 1 + max($this->getHeight($y->left), $this->getHeight($y->right));

$x->height = 1 + max($this->getHeight($x->left), $this->getHeight($x->right));

return $x;

}

private function rightRotate($x) {

$y = $x->left;

$T2 = $y->right;

$y->right = $x;

$x->left = $T2;

$x->height = 1 + max($this->getHeight($x->left), $this->getHeight($x->right));

$y->height = 1 + max($this->getHeight($y->left), $this->getHeight($y->right));

return $y;

}

private function getHeight($node) {

if ($node === null) {

return 0;

}

return $node->height;

}

private function getBalance($node) {

if ($node === null) {

return 0;

}

return $this->getHeight($node->left) - $this->getHeight($node->right);

}

public function preOrder() {

$result = [];

$this->preOrderTraversal($this->root, $result);

return $result;

}

private function preOrderTraversal($node, &$result) {

if ($node === null) {

return;

}

array_push($result, $node->key);

$this->preOrderTraversal($node->left, $result);

$this->preOrderTraversal($node->right, $result);

}

}

// 使用示例

$avlTree = new AVLTree();

$avlTree->insert(10);

$avlTree->insert(20);

$avlTree->insert(30);

$avlTree->insert(40);

$avlTree->insert(50);

$avlTree->insert(25);

$result = $avlTree->preOrder();

echo "