github.com/Mericusta/go-stp@v0.6.8/bs.go (about)

     1  package stp
     2  
     3  type BSTree[T STPOrdered[T]] struct {
     4  	r *bstNode[T]
     5  }
     6  
     7  func NewBSTree[T STPOrdered[T]](v T) *BSTree[T] {
     8  	return &BSTree[T]{r: newBSTNode(v)}
     9  }
    10  
    11  func (t *BSTree[T]) Set(v T) {
    12  	if t.r == nil {
    13  		t.r = newBSTNode(v)
    14  		return
    15  	}
    16  	n := t.r
    17  	for {
    18  		if n.v.LT(v) {
    19  			if n.l == nil {
    20  				n.l = newBSTNode(v)
    21  				return
    22  			} else {
    23  				n = n.l
    24  			}
    25  		} else if n.v.GT(v) {
    26  			if n.r == nil {
    27  				n.r = newBSTNode(v)
    28  				return
    29  			} else {
    30  				n = n.r
    31  			}
    32  		} else {
    33  			return
    34  		}
    35  	}
    36  }
    37  
    38  type bstNode[T any] struct {
    39  	v T
    40  	l *bstNode[T]
    41  	r *bstNode[T]
    42  }
    43  
    44  func newBSTNode[T STPOrdered[T]](v T) *bstNode[T] {
    45  	return &bstNode[T]{v: v}
    46  }