色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

avl php

李明濤1年前6瀏覽0評論

大家好,今天我們來聊一聊關于PHP中的 AVL 樹。

AVL 樹是一種高度平衡二叉樹。它的平衡是通過設定節(jié)點的平衡因子來實現(xiàn)的。平衡因子是指該節(jié)點的左子樹高度與右子樹高度的差值。如果某個節(jié)點的平衡因子為 -1、0 或 1,則認為該節(jié)點平衡。否則,需要通過旋轉來平衡樹。下面我們通過一個例子來具體說明。

class AVLNode {
public $key;
public $balance_factor;
public $left;
public $right;
}
function insert($root, $key) {
if ($root == null) {
$new_node = new AVLNode();
$new_node->key = $key;
$new_node->balance_factor = 0;
$new_node->left = null;
$new_node->right = null;
return $new_node;
}
if ($key< $root->key) {
$root->left = insert($root->left, $key);
$root->balance_factor = getHeight($root->right) - getHeight($root->left);
if ($root->balance_factor == 2) {
if ($key >$root->right->key) {
$root->right = rightRotate($root->right);
}
return leftRotate($root);
}
} elseif ($key >$root->key) {
$root->right = insert($root->right, $key);
$root->balance_factor = getHeight($root->right) - getHeight($root->left);
if ($root->balance_factor == -2) {
if ($key< $root->left->key) {
$root->left = leftRotate($root->left);
}
return rightRotate($root);
}
}
return $root;
}

上述代碼展示了 AVL 樹的插入操作。對于代碼中的四個函數(shù),我們一一說明:

1. insert

該函數(shù)用于向樹中插入一個節(jié)點。如果樹為空,則創(chuàng)建一個新的節(jié)點。如果該節(jié)點不為空,則根據(jù)該節(jié)點的 key 值與插入節(jié)點的 key 值比較,如果插入節(jié)點的 key 值小于該節(jié)點的 key 值,則繼續(xù)在該節(jié)點的左子樹中插入;否則,在該節(jié)點的右子樹中插入。

2. getHeight

該函數(shù)用于獲取節(jié)點的高度。

function getHeight($node) {
if ($node == null) {
return 0;
}
return 1 + max(getHeight($node->left), getHeight($node->right));
}

3. leftRotate

該函數(shù)用于將一個節(jié)點的右子樹旋轉至該節(jié)點的左子樹。下面是代碼:

function leftRotate($x) {
$y = $x->right;
$x->right = $y->left;
$y->left = $x;
$x->balance_factor = getHeight($x->right) - getHeight($x->left);
$y->balance_factor = getHeight($y->right) - getHeight($y->left);
return $y;
}

4. rightRotate

該函數(shù)用于將一個節(jié)點的左子樹旋轉至該節(jié)點的右子樹。下面是代碼:

function rightRotate($x) {
$y = $x->left;
$x->left = $y->right;
$y->right = $x;
$x->balance_factor = getHeight($x->right) - getHeight($x->left);
$y->balance_factor = getHeight($y->right) - getHeight($y->left);
return $y;
}

到這里,我們就介紹了 AVL 樹的插入操作。總體來說,AVL樹是一種高效的平衡二叉樹。相較于其他平衡二叉樹,它的插入和刪除操作需要更多的旋轉操作。但是,由于其高度平衡,它的查找操作效率也很高。