133 lines
3.2 KiB
GDScript
133 lines
3.2 KiB
GDScript
class_name haxe_ds_BalancedTree
|
|
|
|
var root: haxe_ds_TreeNode
|
|
|
|
func _init() -> void:
|
|
pass
|
|
|
|
func __set(key, value) -> void:
|
|
self.root = self.setLoop(key, value, self.root)
|
|
|
|
func __get(key):
|
|
var node: haxe_ds_TreeNode = self.root
|
|
|
|
while (node != null):
|
|
var c: int = self.compare(key, node.key)
|
|
if (c == 0):
|
|
return node.value
|
|
if (c < 0):
|
|
node = node.left
|
|
else:
|
|
node = node.right
|
|
|
|
return null
|
|
|
|
func keys() -> Variant:
|
|
var ret: Array[Variant] = ([] as Array[Variant])
|
|
|
|
self.keysLoop(self.root, ret)
|
|
|
|
return haxe_iterators_ArrayIterator.new(ret)
|
|
|
|
func setLoop(k, v, node: haxe_ds_TreeNode) -> haxe_ds_TreeNode:
|
|
if (node == null):
|
|
return haxe_ds_TreeNode.new(null, k, v, null)
|
|
|
|
var c: int = self.compare(k, node.key)
|
|
var tempResult
|
|
|
|
if (c == 0):
|
|
var tempNumber
|
|
if (node == null):
|
|
tempNumber = 0
|
|
else:
|
|
tempNumber = node._height
|
|
tempResult = haxe_ds_TreeNode.new(node.left, k, v, node.right, tempNumber)
|
|
else:
|
|
if (c < 0):
|
|
var nl: haxe_ds_TreeNode = self.setLoop(k, v, node.left)
|
|
tempResult = self.balance(nl, node.key, node.value, node.right)
|
|
else:
|
|
var nr: haxe_ds_TreeNode = self.setLoop(k, v, node.right)
|
|
tempResult = self.balance(node.left, node.key, node.value, nr)
|
|
|
|
return tempResult
|
|
|
|
func keysLoop(node: haxe_ds_TreeNode, acc: Array[Variant]) -> void:
|
|
if (node != null):
|
|
self.keysLoop(node.left, acc)
|
|
acc.push_back(node.key)
|
|
self.keysLoop(node.right, acc)
|
|
|
|
func balance(l: haxe_ds_TreeNode, k, v, r: haxe_ds_TreeNode) -> haxe_ds_TreeNode:
|
|
var tempNumber
|
|
|
|
if (l == null):
|
|
tempNumber = 0
|
|
else:
|
|
tempNumber = l._height
|
|
|
|
var hl: int = tempNumber
|
|
var tempNumber1
|
|
|
|
if (r == null):
|
|
tempNumber1 = 0
|
|
else:
|
|
tempNumber1 = r._height
|
|
|
|
var hr: int = tempNumber1
|
|
var tempResult
|
|
|
|
if (hl > hr + 2):
|
|
var tempLeft
|
|
if true:
|
|
var _this: haxe_ds_TreeNode = l.left
|
|
if (_this == null):
|
|
tempLeft = 0
|
|
else:
|
|
tempLeft = _this._height
|
|
var tempRight
|
|
if true:
|
|
var _this: haxe_ds_TreeNode = l.right
|
|
if (_this == null):
|
|
tempRight = 0
|
|
else:
|
|
tempRight = _this._height
|
|
if (tempLeft >= tempRight):
|
|
tempResult = haxe_ds_TreeNode.new(l.left, l.key, l.value, haxe_ds_TreeNode.new(l.right, k, v, r))
|
|
else:
|
|
tempResult = haxe_ds_TreeNode.new(haxe_ds_TreeNode.new(l.left, l.key, l.value, l.right.left), l.right.key, l.right.value, haxe_ds_TreeNode.new(l.right.right, k, v, r))
|
|
else:
|
|
if (hr > hl + 2):
|
|
var tempLeft1
|
|
if true:
|
|
var _this: haxe_ds_TreeNode = r.right
|
|
if (_this == null):
|
|
tempLeft1 = 0
|
|
else:
|
|
tempLeft1 = _this._height
|
|
var tempRight1
|
|
if true:
|
|
var _this: haxe_ds_TreeNode = r.left
|
|
if (_this == null):
|
|
tempRight1 = 0
|
|
else:
|
|
tempRight1 = _this._height
|
|
if (tempLeft1 > tempRight1):
|
|
tempResult = haxe_ds_TreeNode.new(haxe_ds_TreeNode.new(l, k, v, r.left), r.key, r.value, r.right)
|
|
else:
|
|
tempResult = haxe_ds_TreeNode.new(haxe_ds_TreeNode.new(l, k, v, r.left.left), r.left.key, r.left.value, haxe_ds_TreeNode.new(r.left.right, r.key, r.value, r.right))
|
|
else:
|
|
var tempNumber2
|
|
if (hl > hr):
|
|
tempNumber2 = hl
|
|
else:
|
|
tempNumber2 = hr
|
|
tempResult = haxe_ds_TreeNode.new(l, k, v, r, (tempNumber2) + 1)
|
|
|
|
return tempResult
|
|
|
|
func compare(k1, k2) -> int:
|
|
return Reflect.compare(k1, k2)
|
|
|