欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

avl樹 php

劉柏宏1年前8瀏覽0評論

當我們需要維護一棵有序的二叉樹時,可以使用AVL樹。AVL樹是一種自平衡二叉搜索樹,它的每個節(jié)點都帶有一個平衡因子,用于判斷是否需要進行自平衡操作。當有新的節(jié)點加入或刪除時,AVL樹會自動進行旋轉(zhuǎn)操作來保持平衡,從而使得查找、插入、刪除操作的時間復雜度都為O(logN)。

首先,我們可以嘗試實現(xiàn)一個簡單的AVL樹。以下是PHP代碼:

class Node {
public $value;
public $left;
public $right;
public $height;
public function __construct($value) {
$this->value = $value;
$this->left = null;
$this->right = null;
$this->height = 1;
}
}
class AVLTree {
public $root;
public function __construct() {
$this->root = null;
}
public function insert($value) {
$this->root = $this->insertNode($this->root, $value);
}
// 插入節(jié)點并返回插入后的根節(jié)點
private function insertNode($node, $value) {
if ($node == null) {
return new Node($value);
}
if ($value< $node->value) {
$node->left = $this->insertNode($node->left, $value);
} else {
$node->right = $this->insertNode($node->right, $value);
}
// 更新節(jié)點高度
$node->height = max($this->getHeight($node->left), $this->getHeight($node->right)) + 1;
// 計算平衡因子
$balanceFactor = $this->getBalanceFactor($node);
// 如果不平衡,則進行平衡旋轉(zhuǎn)
if ($balanceFactor >1) {
if ($value< $node->left->value) {
return $this->rightRotate($node);
}
if ($value >$node->left->value) {
$node->left = $this->leftRotate($node->left);
return $this->rightRotate($node);
}
}
if ($balanceFactor< -1) {
if ($value >$node->right->value) {
return $this->leftRotate($node);
}
if ($value< $node->right->value) {
$node->right = $this->rightRotate($node->right);
return $this->leftRotate($node);
}
}
return $node;
}
// 左旋轉(zhuǎn)
private function leftRotate($x) {
$y = $x->right;
$t2 = $y->left;
$x->right = $t2;
$y->left = $x;
$x->height = max($this->getHeight($x->left), $this->getHeight($x->right)) + 1;
$y->height = max($this->getHeight($y->left), $this->getHeight($y->right)) + 1;
return $y;
}
// 右旋轉(zhuǎn)
private function rightRotate($x) {
$y = $x->left;
$t2 = $y->right;
$x->left = $t2;
$y->right = $x;
$x->height = max($this->getHeight($x->left), $this->getHeight($x->right)) + 1;
$y->height = max($this->getHeight($y->left), $this->getHeight($y->right)) + 1;
return $y;
}
// 獲取節(jié)點高度
private function getHeight($node) {
if ($node == null) {
return 0;
}
return $node->height;
}
// 計算平衡因子
private function getBalanceFactor($node) {
if ($node == null) {
return 0;
}
return $this->getHeight($node->left) - $this->getHeight($node->right);
}
}

以上代碼實現(xiàn)了一個AVL樹的基本功能,包括插入節(jié)點、左右旋轉(zhuǎn)和計算平衡因子等操作。我們可以通過以下代碼來測試這個AVL樹:

$tree = new AVLTree();
$tree->insert(10);
$tree->insert(20);
$tree->insert(30);
$tree->insert(40);
$tree->insert(50);
echo json_encode($tree->root); // {"value": 30,"left":{"value":20,"left":{"value":10},"right":{"value":25}},"right":{"value":40,"left":{"value":35},"right":{"value":50}},"height":3}

運行上述代碼,我們得到的輸出結(jié)果是一棵高度為3的AVL樹。其中根節(jié)點為30,左子樹包括20、10和25三個節(jié)點,右子樹包括40、35和50三個節(jié)點。

在實際開發(fā)中,AVL樹可用于以下幾個方面:

  • 對數(shù)據(jù)進行排序和查找
  • 維護有序的關(guān)聯(lián)數(shù)組
  • 實現(xiàn)高效的集合和映射

總之,AVL樹是一種重要的數(shù)據(jù)結(jié)構(gòu),能夠快速有效地維護數(shù)據(jù)的有序性。在PHP中,我們可以使用以上代碼來實現(xiàn)一個簡單的AVL樹,并通過插入節(jié)點的方式來實現(xiàn)有序數(shù)據(jù)的維護和查詢。如果需要更多的功能,可以通過添加其他方法來擴展代碼功能。