feat: add HasSubTree func for BSTree

This commit is contained in:
dudaodong
2022-04-27 10:43:01 +08:00
parent e98c46c903
commit 0d48778886
3 changed files with 30 additions and 8 deletions

View File

@@ -78,25 +78,25 @@ func (t *BSTree[T]) Depth() int {
}
// IsSubTree checks if the tree `t`` has `subTree` or not
func (t *BSTree[T]) IsSubTree(subTree *BSTree[T]) bool {
return isSubTree(t.root, subTree.root, t.comparator)
func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool {
return hasSubTree(t.root, subTree.root, t.comparator)
}
func isSubTree[T any](superTreeRoot, subTreeRoot *datastructure.TreeNode[T],
func hasSubTree[T any](superTreeRoot, subTreeRoot *datastructure.TreeNode[T],
comparator lancetconstraints.Comparator) bool {
res := false
if superTreeRoot != nil && subTreeRoot != nil {
if comparator.Compare(superTreeRoot.Value, subTreeRoot.Value) == 0 {
res = hasSubTree(superTreeRoot, subTreeRoot, comparator)
res = isSubTree(superTreeRoot, subTreeRoot, comparator)
}
if !res {
res = isSubTree(superTreeRoot.Left, subTreeRoot, comparator)
res = hasSubTree(superTreeRoot.Left, subTreeRoot, comparator)
}
if !res {
res = isSubTree(superTreeRoot.Right, subTreeRoot, comparator)
res = hasSubTree(superTreeRoot.Right, subTreeRoot, comparator)
}
}
return res

View File

@@ -133,3 +133,25 @@ func TestBSTree_Depth(t *testing.T) {
assert.Equal(bstree.Depth(), 4)
}
func TestBSTree_IsSubTree(t *testing.T) {
assert := internal.NewAssert(t, "TestBSTree_IsSubTree")
superTree := NewBSTree(6, &intComparator{})
superTree.InsertNode(7)
superTree.InsertNode(5)
superTree.InsertNode(2)
superTree.InsertNode(4)
superTree.Print()
subTree1 := NewBSTree(3, &intComparator{})
subTree1.InsertNode(5)
subTree1.InsertNode(2)
subTree1.InsertNode(4)
assert.Equal(true, superTree)
subTree1.Print()
}

View File

@@ -216,7 +216,7 @@ func calculateDepth[T any](node *datastructure.TreeNode[T], depth int) int {
return max(calculateDepth(node.Left, depth+1), calculateDepth(node.Right, depth+1))
}
func hasSubTree[T any](superTreeRoot, subTreeRoot *datastructure.TreeNode[T], comparator lancetconstraints.Comparator) bool {
func isSubTree[T any](superTreeRoot, subTreeRoot *datastructure.TreeNode[T], comparator lancetconstraints.Comparator) bool {
if subTreeRoot == nil {
return true
}
@@ -227,7 +227,7 @@ func hasSubTree[T any](superTreeRoot, subTreeRoot *datastructure.TreeNode[T], co
return false
}
return hasSubTree(superTreeRoot.Left, subTreeRoot.Left, comparator) && hasSubTree(superTreeRoot.Right, subTreeRoot.Right, comparator)
return isSubTree(superTreeRoot.Left, subTreeRoot.Left, comparator) && hasSubTree(superTreeRoot.Right, subTreeRoot.Right, comparator)
}
func max(a, b int) int {