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  }