# Tree Tree is a collection of tree nodes. Each tree node has a value, a left pointer point to left node and a right pointer point to right node.
## Source - [https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go](https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go) ## Usage ```go import ( tree "github.com/duke-git/lancet/v2/datastructure/tree" ) ``` ## Index ### 1. BSTree - [NewBSTree](#NewBSTree) - [Insert](#BSTree_Insert) - [Delete](#BSTree_Delete) - [PreOrderTraverse](#BSTree_PreOrderTraverse) - [InOrderTraverse](#BSTree_InOrderTraverse) - [PostOrderTraverse](#BSTree_PostOrderTraverse) - [LevelOrderTraverse](#BSTree_LevelOrderTraverse) - [Depth](#BSTree_Depth) - [HasSubTree](#BSTree_HasSubTree) - [Print](#BSTree_Print) ## Documentation ## 1. BSTree BSTree is a binary search tree data structure in which each node has at two children, which are referred to as the left child and the right child. In BSTree: leftNode < rootNode < rightNode. Type T should implements Compare function in constraints.Comparator interface. ### NewBSTreeMake a BSTree pointer instance
Signature: ```go func NewBSTree[T any](rootData T, comparator constraints.Comparator) *BSTree[T] type BSTree[T any] struct { root *datastructure.TreeNode[T] comparator constraints.Comparator } type TreeNode[T any] struct { Value T Left *TreeNode[T] Right *TreeNode[T] } ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { bstree := tree.NewBSTree(6, &intComparator{}) fmt.Println(bstree) // } ``` ### InsertInsert value into binary search tree
Signature: ```go func (t *BSTree[T]) Insert(data T) ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { bstree := tree.NewBSTree(6, &intComparator{}) bstree.Insert(7) bstree.Insert(5) bstree.Insert(2) bstree.Insert(4) fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7 } ``` ### DeleteDelete value of binary search tree
Signature: ```go func (t *BSTree[T]) Delete(data T) ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { bstree := tree.NewBSTree(6, &intComparator{}) bstree.Insert(7) bstree.Insert(5) bstree.Insert(2) bstree.Insert(4) bstree.Delete(4) fmt.Println(bstree.PreOrderTraverse()) //2, 5, 6, 7 } ``` ### PreOrderTraverseTraverse tree nodes in pre order
Signature: ```go func (t *BSTree[T]) PreOrderTraverse() []T ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { bstree := tree.NewBSTree(6, &intComparator{}) bstree.Insert(7) bstree.Insert(5) bstree.Insert(2) bstree.Insert(4) fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7 } ``` ### InOrderTraverseTraverse tree nodes in middle order
Signature: ```go func (t *BSTree[T]) InOrderTraverse() []T ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { bstree := tree.NewBSTree(6, &intComparator{}) bstree.Insert(7) bstree.Insert(5) bstree.Insert(2) bstree.Insert(4) fmt.Println(bstree.InOrderTraverse()) //2, 4, 5, 6, 7 } ``` ### PostOrderTraverseTraverse tree nodes in post order
Signature: ```go func (t *BSTree[T]) PostOrderTraverse() []T ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { bstree := tree.NewBSTree(6, &intComparator{}) bstree.Insert(7) bstree.Insert(5) bstree.Insert(2) bstree.Insert(4) fmt.Println(bstree.PostOrderTraverse()) //5, 2, 4, 7, 6 } ``` ### LevelOrderTraverseTraverse tree nodes in node level order
Signature: ```go func (t *BSTree[T]) LevelOrderTraverse() []T ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { bstree := tree.NewBSTree(6, &intComparator{}) bstree.Insert(7) bstree.Insert(5) bstree.Insert(2) bstree.Insert(4) fmt.Println(bstree.LevelOrderTraverse()) //6, 5, 7, 2, 4 } ``` ### DepthGet the depth of a binary saerch tree
Signature: ```go func (t *BSTree[T]) Depth() int ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { bstree := tree.NewBSTree(6, &intComparator{}) bstree.Insert(7) bstree.Insert(5) bstree.Insert(2) bstree.Insert(4) fmt.Println(bstree.Depth()) //4 } ``` ### HasSubTreeCheck if the given tree is sub tree of origin tree or not
Signature: ```go func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { superTree := tree.NewBSTree(8, &intComparator{}) superTree.Insert(4) superTree.Insert(5) superTree.Insert(6) superTree.Insert(9) superTree.Insert(4) subTree := tree.NewBSTree(5, &intComparator{}) subTree.Insert(4) subTree.Insert(6) fmt.Println(superTree.HasSubTree(subTree)) //true fmt.Println(subTree.HasSubTree(superTree)) //false } ``` ### PrintPrint the structure of binary saerch tree
Signature: ```go func (t *BSTree[T]) Print() ``` Example: ```go package main import ( "fmt" tree "github.com/duke-git/lancet/v2/datastructure/tree" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { bstree := tree.NewBSTree(6, &intComparator{}) bstree.Insert(7) bstree.Insert(5) bstree.Insert(2) bstree.Insert(4) fmt.Println(bstree.Print()) // 6 // / \ // / \ // / \ // / \ // 5 7 // / // / // 2 // \ // 4 } ```