github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/gnovm/tests/files/extern/timtadh/data_structures/tree/avl/avltree.gno (about) 1 // modified from https://github.com/timtadh/data_structures 2 3 package avl 4 5 import ( 6 "fmt" 7 8 "github.com/gnolang/gno/_test/timtadh/data_structures/tree" 9 "github.com/gnolang/gno/_test/timtadh/data_structures/types" 10 ) 11 12 func abs(i int) int { 13 if i < 0 { 14 return -i 15 } 16 return i 17 } 18 19 func max(a, b int) int { 20 if a > b { 21 return a 22 } 23 return b 24 } 25 26 type AvlTree struct { 27 root *AvlNode 28 } 29 30 func NewAvlTree() *AvlTree { 31 return &AvlTree{} 32 } 33 34 func (self *AvlTree) Root() types.TreeNode { 35 return self.root 36 } 37 38 func (self *AvlTree) Size() int { 39 return self.root.Size() 40 } 41 42 func (self *AvlTree) Has(key types.Hashable) bool { 43 return self.root.Has(key) 44 } 45 46 func (self *AvlTree) Put(key types.Hashable, value interface{}) (err error) { 47 self.root, _ = self.root.Put(key, value) 48 return nil 49 } 50 51 func (self *AvlTree) Get(key types.Hashable) (value interface{}, err error) { 52 return self.root.Get(key) 53 } 54 55 func (self *AvlTree) Remove(key types.Hashable) (value interface{}, err error) { 56 new_root, value, err := self.root.Remove(key) 57 if err != nil { 58 return nil, err 59 } 60 self.root = new_root 61 return value, nil 62 } 63 64 func (self *AvlTree) Iterate() types.KVIterator { 65 return self.root.Iterate() 66 } 67 68 func (self *AvlTree) Items() (vi types.KIterator) { 69 return types.MakeItemsIterator(self) 70 } 71 72 func (self *AvlTree) Values() types.Iterator { 73 return self.root.Values() 74 } 75 76 func (self *AvlTree) Keys() types.KIterator { 77 return self.root.Keys() 78 } 79 80 type AvlNode struct { 81 key types.Hashable 82 value interface{} 83 height int 84 left *AvlNode 85 right *AvlNode 86 } 87 88 func (self *AvlNode) Has(key types.Hashable) (has bool) { 89 if self == nil { 90 return false 91 } 92 if self.key.Equals(key) { 93 return true 94 } else if key.Less(self.key) { 95 return self.left.Has(key) 96 } else { 97 return self.right.Has(key) 98 } 99 } 100 101 func (self *AvlNode) Get(key types.Hashable) (value interface{}, err error) { 102 if self == nil { 103 return nil, fmt.Errorf("%v", key) 104 } 105 if self.key.Equals(key) { 106 return self.value, nil 107 } else if key.Less(self.key) { 108 return self.left.Get(key) 109 } else { 110 return self.right.Get(key) 111 } 112 } 113 114 func (self *AvlNode) pop_node(node *AvlNode) *AvlNode { 115 if node == nil { 116 panic("node can't be nil") 117 } else if node.left != nil && node.right != nil { 118 panic("node must not have both left and right") 119 } 120 121 if self == nil { 122 return nil 123 } else if self == node { 124 var nnn *AvlNode 125 if node.left != nil { 126 nnn = node.left 127 } else if node.right != nil { 128 nnn = node.right 129 } else { 130 nnn = nil 131 } 132 node.left = nil 133 node.right = nil 134 return nnn 135 } 136 137 if node.key.Less(self.key) { 138 self.left = self.left.pop_node(node) 139 } else { 140 self.right = self.right.pop_node(node) 141 } 142 143 self.height = max(self.left.Height(), self.right.Height()) + 1 144 return self 145 } 146 147 func (self *AvlNode) push_node(node *AvlNode) *AvlNode { 148 if node == nil { 149 panic("node can't be nil") 150 } else if node.left != nil || node.right != nil { 151 panic("node now be a leaf") 152 } 153 154 if self == nil { 155 node.height = 1 156 return node 157 } else if node.key.Less(self.key) { 158 self.left = self.left.push_node(node) 159 } else { 160 self.right = self.right.push_node(node) 161 } 162 self.height = max(self.left.Height(), self.right.Height()) + 1 163 return self 164 } 165 166 func (self *AvlNode) rotate_right() *AvlNode { 167 if self == nil { 168 return self 169 } 170 if self.left == nil { 171 return self 172 } 173 new_root := self.left.rmd() 174 self = self.pop_node(new_root) 175 new_root.left = self.left 176 new_root.right = self.right 177 self.left = nil 178 self.right = nil 179 return new_root.push_node(self) 180 } 181 182 func (self *AvlNode) rotate_left() *AvlNode { 183 if self == nil { 184 return self 185 } 186 if self.right == nil { 187 return self 188 } 189 new_root := self.right.lmd() 190 self = self.pop_node(new_root) 191 new_root.left = self.left 192 new_root.right = self.right 193 self.left = nil 194 self.right = nil 195 return new_root.push_node(self) 196 } 197 198 func (self *AvlNode) balance() *AvlNode { 199 if self == nil { 200 return self 201 } 202 for abs(self.left.Height()-self.right.Height()) > 2 { 203 if self.left.Height() > self.right.Height() { 204 self = self.rotate_right() 205 } else { 206 self = self.rotate_left() 207 } 208 } 209 return self 210 } 211 212 func (self *AvlNode) Put(key types.Hashable, value interface{}) (_ *AvlNode, updated bool) { 213 if self == nil { 214 return &AvlNode{key: key, value: value, height: 1}, false 215 } 216 217 if self.key.Equals(key) { 218 self.value = value 219 return self, true 220 } 221 222 if key.Less(self.key) { 223 self.left, updated = self.left.Put(key, value) 224 } else { 225 self.right, updated = self.right.Put(key, value) 226 } 227 if !updated { 228 self.height += 1 229 return self.balance(), updated 230 } 231 return self, updated 232 } 233 234 func (self *AvlNode) Remove(key types.Hashable) (_ *AvlNode, value interface{}, err error) { 235 if self == nil { 236 return nil, nil, fmt.Errorf("%v", key) 237 } 238 239 if self.key.Equals(key) { 240 if self.left != nil && self.right != nil { 241 if self.left.Size() < self.right.Size() { 242 lmd := self.right.lmd() 243 lmd.left = self.left 244 return self.right, self.value, nil 245 } else { 246 rmd := self.left.rmd() 247 rmd.right = self.right 248 return self.left, self.value, nil 249 } 250 } else if self.left == nil { 251 return self.right, self.value, nil 252 } else if self.right == nil { 253 return self.left, self.value, nil 254 } else { 255 return nil, self.value, nil 256 } 257 } 258 if key.Less(self.key) { 259 self.left, value, err = self.left.Remove(key) 260 } else { 261 self.right, value, err = self.right.Remove(key) 262 } 263 if err != nil { 264 return self.balance(), value, err 265 } 266 return self, value, err 267 } 268 269 func (self *AvlNode) Height() int { 270 if self == nil { 271 return 0 272 } 273 return self.height 274 } 275 276 func (self *AvlNode) Size() int { 277 if self == nil { 278 return 0 279 } 280 return 1 + self.left.Size() + self.right.Size() 281 } 282 283 // XXX added by gno 284 func (self *AvlNode) IsNil() bool { 285 return self == nil 286 } 287 288 func (self *AvlNode) Key() types.Hashable { 289 return self.key 290 } 291 292 func (self *AvlNode) Value() interface{} { 293 return self.value 294 } 295 296 func (self *AvlNode) Left() types.BinaryTreeNode { 297 if self.left == nil { 298 return nil 299 } 300 return self.left 301 } 302 303 func (self *AvlNode) Right() types.BinaryTreeNode { 304 if self.right == nil { 305 return nil 306 } 307 return self.right 308 } 309 310 func (self *AvlNode) GetChild(i int) types.TreeNode { 311 return types.DoGetChild(self, i) 312 } 313 314 func (self *AvlNode) ChildCount() int { 315 return types.DoChildCount(self) 316 } 317 318 func (self *AvlNode) Children() types.TreeNodeIterator { 319 return types.MakeChildrenIterator(self) 320 } 321 322 func (self *AvlNode) Iterate() types.KVIterator { 323 tni := tree.TraverseBinaryTreeInOrder(self) 324 return types.MakeKVIteratorFromTreeNodeIterator(tni) 325 } 326 327 func (self *AvlNode) Keys() types.KIterator { 328 return types.MakeKeysIterator(self) 329 } 330 331 func (self *AvlNode) Values() types.Iterator { 332 return types.MakeValuesIterator(self) 333 } 334 335 func (self *AvlNode) _md(side func(*AvlNode) *AvlNode) *AvlNode { 336 if self == nil { 337 return nil 338 } else if side(self) != nil { 339 return side(self)._md(side) 340 } else { 341 return self 342 } 343 } 344 345 func (self *AvlNode) lmd() *AvlNode { 346 return self._md(func(node *AvlNode) *AvlNode { return node.left }) 347 } 348 349 func (self *AvlNode) rmd() *AvlNode { 350 return self._md(func(node *AvlNode) *AvlNode { return node.right }) 351 }