github.com/mymmsc/gox@v1.3.33/util/avltree/avltree.go (about)

     1  // Copyright (c) 2017, Benjamin Scher Purcell. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package avltree implements an AVL balanced binary tree.
     6  //
     7  // Structure is not thread safe.
     8  //
     9  // References: https://en.wikipedia.org/wiki/AVL_tree
    10  package avltree
    11  
    12  import (
    13  	"fmt"
    14  	"github.com/mymmsc/gox/util"
    15  )
    16  
    17  func assertTreeImplementation() {
    18  	var _ util.Tree = new(Tree)
    19  }
    20  
    21  // Tree holds elements of the AVL tree.
    22  type Tree struct {
    23  	Root       *Node           // Root node
    24  	Comparator util.Comparator // Key comparator
    25  	size       int             // Total number of keys in the tree
    26  }
    27  
    28  // Node is a single element within the tree
    29  type Node struct {
    30  	Key      interface{}
    31  	Value    interface{}
    32  	Parent   *Node    // Parent node
    33  	Children [2]*Node // Children nodes
    34  	b        int8
    35  }
    36  
    37  // NewWith instantiates an AVL tree with the custom comparator.
    38  func NewWith(comparator util.Comparator) *Tree {
    39  	return &Tree{Comparator: comparator}
    40  }
    41  
    42  // NewWithIntComparator instantiates an AVL tree with the IntComparator, i.e. keys are of type int.
    43  func NewWithIntComparator() *Tree {
    44  	return &Tree{Comparator: util.IntComparator}
    45  }
    46  
    47  // NewWithStringComparator instantiates an AVL tree with the StringComparator, i.e. keys are of type string.
    48  func NewWithStringComparator() *Tree {
    49  	return &Tree{Comparator: util.StringComparator}
    50  }
    51  
    52  // Put inserts node into the tree.
    53  // Key should adhere to the comparator's type assertion, otherwise method panics.
    54  func (t *Tree) Put(key interface{}, value interface{}) {
    55  	t.put(key, value, nil, &t.Root)
    56  }
    57  
    58  // Get searches the node in the tree by key and returns its value or nil if key is not found in tree.
    59  // Second return parameter is true if key was found, otherwise false.
    60  // Key should adhere to the comparator's type assertion, otherwise method panics.
    61  func (t *Tree) Get(key interface{}) (value interface{}, found bool) {
    62  	n := t.Root
    63  	for n != nil {
    64  		cmp := t.Comparator(key, n.Key)
    65  		switch {
    66  		case cmp == 0:
    67  			return n.Value, true
    68  		case cmp < 0:
    69  			n = n.Children[0]
    70  		case cmp > 0:
    71  			n = n.Children[1]
    72  		}
    73  	}
    74  	return nil, false
    75  }
    76  
    77  // Remove remove the node from the tree by key.
    78  // Key should adhere to the comparator's type assertion, otherwise method panics.
    79  func (t *Tree) Remove(key interface{}) {
    80  	t.remove(key, &t.Root)
    81  }
    82  
    83  // Empty returns true if tree does not contain any nodes.
    84  func (t *Tree) Empty() bool {
    85  	return t.size == 0
    86  }
    87  
    88  // Size returns the number of elements stored in the tree.
    89  func (t *Tree) Size() int {
    90  	return t.size
    91  }
    92  
    93  // Keys returns all keys in-order
    94  func (t *Tree) Keys() []interface{} {
    95  	keys := make([]interface{}, t.size)
    96  	it := t.Iterator()
    97  	for i := 0; it.Next(); i++ {
    98  		keys[i] = it.Key()
    99  	}
   100  	return keys
   101  }
   102  
   103  // Values returns all values in-order based on the key.
   104  func (t *Tree) Values() []interface{} {
   105  	values := make([]interface{}, t.size)
   106  	it := t.Iterator()
   107  	for i := 0; it.Next(); i++ {
   108  		values[i] = it.Value()
   109  	}
   110  	return values
   111  }
   112  
   113  // Left returns the minimum element of the AVL tree
   114  // or nil if the tree is empty.
   115  func (t *Tree) Left() *Node {
   116  	return t.bottom(0)
   117  }
   118  
   119  // Right returns the maximum element of the AVL tree
   120  // or nil if the tree is empty.
   121  func (t *Tree) Right() *Node {
   122  	return t.bottom(1)
   123  }
   124  
   125  // Floor Finds floor node of the input key, return the floor node or nil if no ceiling is found.
   126  // Second return parameter is true if floor was found, otherwise false.
   127  //
   128  // Floor node is defined as the largest node that is smaller than or equal to the given node.
   129  // A floor node may not be found, either because the tree is empty, or because
   130  // all nodes in the tree is larger than the given node.
   131  //
   132  // Key should adhere to the comparator's type assertion, otherwise method panics.
   133  func (t *Tree) Floor(key interface{}) (floor *Node, found bool) {
   134  	found = false
   135  	n := t.Root
   136  	for n != nil {
   137  		c := t.Comparator(key, n.Key)
   138  		switch {
   139  		case c == 0:
   140  			return n, true
   141  		case c < 0:
   142  			n = n.Children[0]
   143  		case c > 0:
   144  			floor, found = n, true
   145  			n = n.Children[1]
   146  		}
   147  	}
   148  	if found {
   149  		return
   150  	}
   151  	return nil, false
   152  }
   153  
   154  // Ceiling finds ceiling node of the input key, return the ceiling node or nil if no ceiling is found.
   155  // Second return parameter is true if ceiling was found, otherwise false.
   156  //
   157  // Ceiling node is defined as the smallest node that is larger than or equal to the given node.
   158  // A ceiling node may not be found, either because the tree is empty, or because
   159  // all nodes in the tree is smaller than the given node.
   160  //
   161  // Key should adhere to the comparator's type assertion, otherwise method panics.
   162  func (t *Tree) Ceiling(key interface{}) (floor *Node, found bool) {
   163  	found = false
   164  	n := t.Root
   165  	for n != nil {
   166  		c := t.Comparator(key, n.Key)
   167  		switch {
   168  		case c == 0:
   169  			return n, true
   170  		case c < 0:
   171  			floor, found = n, true
   172  			n = n.Children[0]
   173  		case c > 0:
   174  			n = n.Children[1]
   175  		}
   176  	}
   177  	if found {
   178  		return
   179  	}
   180  	return nil, false
   181  }
   182  
   183  // Clear removes all nodes from the tree.
   184  func (t *Tree) Clear() {
   185  	t.Root = nil
   186  	t.size = 0
   187  }
   188  
   189  // String returns a string representation of container
   190  func (t *Tree) String() string {
   191  	str := "AVLTree\n"
   192  	if !t.Empty() {
   193  		output(t.Root, "", true, &str)
   194  	}
   195  	return str
   196  }
   197  
   198  func (n *Node) String() string {
   199  	return fmt.Sprintf("%v", n.Key)
   200  }
   201  
   202  func (t *Tree) put(key interface{}, value interface{}, p *Node, qp **Node) bool {
   203  	q := *qp
   204  	if q == nil {
   205  		t.size++
   206  		*qp = &Node{Key: key, Value: value, Parent: p}
   207  		return true
   208  	}
   209  
   210  	c := t.Comparator(key, q.Key)
   211  	if c == 0 {
   212  		q.Key = key
   213  		q.Value = value
   214  		return false
   215  	}
   216  
   217  	if c < 0 {
   218  		c = -1
   219  	} else {
   220  		c = 1
   221  	}
   222  	a := (c + 1) / 2
   223  	var fix bool
   224  	fix = t.put(key, value, q, &q.Children[a])
   225  	if fix {
   226  		return putFix(int8(c), qp)
   227  	}
   228  	return false
   229  }
   230  
   231  func (t *Tree) remove(key interface{}, qp **Node) bool {
   232  	q := *qp
   233  	if q == nil {
   234  		return false
   235  	}
   236  
   237  	c := t.Comparator(key, q.Key)
   238  	if c == 0 {
   239  		t.size--
   240  		if q.Children[1] == nil {
   241  			if q.Children[0] != nil {
   242  				q.Children[0].Parent = q.Parent
   243  			}
   244  			*qp = q.Children[0]
   245  			return true
   246  		}
   247  		fix := removeMin(&q.Children[1], &q.Key, &q.Value)
   248  		if fix {
   249  			return removeFix(-1, qp)
   250  		}
   251  		return false
   252  	}
   253  
   254  	if c < 0 {
   255  		c = -1
   256  	} else {
   257  		c = 1
   258  	}
   259  	a := (c + 1) / 2
   260  	fix := t.remove(key, &q.Children[a])
   261  	if fix {
   262  		return removeFix(int8(-c), qp)
   263  	}
   264  	return false
   265  }
   266  
   267  func removeMin(qp **Node, minKey *interface{}, minVal *interface{}) bool {
   268  	q := *qp
   269  	if q.Children[0] == nil {
   270  		*minKey = q.Key
   271  		*minVal = q.Value
   272  		if q.Children[1] != nil {
   273  			q.Children[1].Parent = q.Parent
   274  		}
   275  		*qp = q.Children[1]
   276  		return true
   277  	}
   278  	fix := removeMin(&q.Children[0], minKey, minVal)
   279  	if fix {
   280  		return removeFix(1, qp)
   281  	}
   282  	return false
   283  }
   284  
   285  func putFix(c int8, t **Node) bool {
   286  	s := *t
   287  	if s.b == 0 {
   288  		s.b = c
   289  		return true
   290  	}
   291  
   292  	if s.b == -c {
   293  		s.b = 0
   294  		return false
   295  	}
   296  
   297  	if s.Children[(c+1)/2].b == c {
   298  		s = singlerot(c, s)
   299  	} else {
   300  		s = doublerot(c, s)
   301  	}
   302  	*t = s
   303  	return false
   304  }
   305  
   306  func removeFix(c int8, t **Node) bool {
   307  	s := *t
   308  	if s.b == 0 {
   309  		s.b = c
   310  		return false
   311  	}
   312  
   313  	if s.b == -c {
   314  		s.b = 0
   315  		return true
   316  	}
   317  
   318  	a := (c + 1) / 2
   319  	if s.Children[a].b == 0 {
   320  		s = rotate(c, s)
   321  		s.b = -c
   322  		*t = s
   323  		return false
   324  	}
   325  
   326  	if s.Children[a].b == c {
   327  		s = singlerot(c, s)
   328  	} else {
   329  		s = doublerot(c, s)
   330  	}
   331  	*t = s
   332  	return true
   333  }
   334  
   335  func singlerot(c int8, s *Node) *Node {
   336  	s.b = 0
   337  	s = rotate(c, s)
   338  	s.b = 0
   339  	return s
   340  }
   341  
   342  func doublerot(c int8, s *Node) *Node {
   343  	a := (c + 1) / 2
   344  	r := s.Children[a]
   345  	s.Children[a] = rotate(-c, s.Children[a])
   346  	p := rotate(c, s)
   347  
   348  	switch {
   349  	default:
   350  		s.b = 0
   351  		r.b = 0
   352  	case p.b == c:
   353  		s.b = -c
   354  		r.b = 0
   355  	case p.b == -c:
   356  		s.b = 0
   357  		r.b = c
   358  	}
   359  
   360  	p.b = 0
   361  	return p
   362  }
   363  
   364  func rotate(c int8, s *Node) *Node {
   365  	a := (c + 1) / 2
   366  	r := s.Children[a]
   367  	s.Children[a] = r.Children[a^1]
   368  	if s.Children[a] != nil {
   369  		s.Children[a].Parent = s
   370  	}
   371  	r.Children[a^1] = s
   372  	r.Parent = s.Parent
   373  	s.Parent = r
   374  	return r
   375  }
   376  
   377  func (t *Tree) bottom(d int) *Node {
   378  	n := t.Root
   379  	if n == nil {
   380  		return nil
   381  	}
   382  
   383  	for c := n.Children[d]; c != nil; c = n.Children[d] {
   384  		n = c
   385  	}
   386  	return n
   387  }
   388  
   389  // Prev returns the previous element in an inorder
   390  // walk of the AVL tree.
   391  func (n *Node) Prev() *Node {
   392  	return n.walk1(0)
   393  }
   394  
   395  // Next returns the next element in an inorder
   396  // walk of the AVL tree.
   397  func (n *Node) Next() *Node {
   398  	return n.walk1(1)
   399  }
   400  
   401  func (n *Node) walk1(a int) *Node {
   402  	if n == nil {
   403  		return nil
   404  	}
   405  
   406  	if n.Children[a] != nil {
   407  		n = n.Children[a]
   408  		for n.Children[a^1] != nil {
   409  			n = n.Children[a^1]
   410  		}
   411  		return n
   412  	}
   413  
   414  	p := n.Parent
   415  	for p != nil && p.Children[a] == n {
   416  		n = p
   417  		p = p.Parent
   418  	}
   419  	return p
   420  }
   421  
   422  func output(node *Node, prefix string, isTail bool, str *string) {
   423  	if node.Children[1] != nil {
   424  		newPrefix := prefix
   425  		if isTail {
   426  			newPrefix += "│   "
   427  		} else {
   428  			newPrefix += "    "
   429  		}
   430  		output(node.Children[1], newPrefix, false, str)
   431  	}
   432  	*str += prefix
   433  	if isTail {
   434  		*str += "└── "
   435  	} else {
   436  		*str += "┌── "
   437  	}
   438  	*str += node.String() + "\n"
   439  	if node.Children[0] != nil {
   440  		newPrefix := prefix
   441  		if isTail {
   442  			newPrefix += "    "
   443  		} else {
   444  			newPrefix += "│   "
   445  		}
   446  		output(node.Children[0], newPrefix, true, str)
   447  	}
   448  }