大家好,今天我們來聊一聊關于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樹是一種高效的平衡二叉樹。相較于其他平衡二叉樹,它的插入和刪除操作需要更多的旋轉操作。但是,由于其高度平衡,它的查找操作效率也很高。