关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!
树是一种重要的数据结构,而二叉搜索树(BST)则是树的一种常见形式。在本文中,我们将学习如何构建一个高效的二叉搜索树联系簿,以便快速插入、搜索和删除联系人信息。
二叉搜索树是一种有序的二叉树,其中每个节点都包含一个可比较的键和关联的值。它满足以下性质:
二叉搜索树的结构使得在其中插入、搜索和删除节点的操作都能在平均时间复杂度为O(log n)的情况下完成。
我们将使用Go语言来实现这个联系簿结构。首先,我们定义一个AddressBookNode
结构体,它代表树中的一个节点,并包含姓名、联系信息以及左右子节点的指针。
type AddressBookNode struct {
Name string
ContactInfo string
Left *AddressBookNode
Right *AddressBookNode
}
为了将联系人添加到联系簿中,我们实现了InsertContact
方法。该方法接受一个姓名和联系信息作为输入,并根据二叉搜索树的性质将联系人插入到合适的位置。
func (n *AddressBookNode) InsertContact(name, contactInfo string) *AddressBookNode {
if n == nil {
return &AddressBookNode{Name: name, ContactInfo: contactInfo, Left: nil, Right: nil}
}
if name < n.Name {
n.Left = n.Left.InsertContact(name, contactInfo)
} else if name > n.Name {
n.Right = n.Right.InsertContact(name, contactInfo)
}
return n
}
该方法的工作原理如下:
AddressBookNode
,并将其作为树的根节点。InsertContact
方法。InsertContact
方法。为了在联系簿中搜索联系人,我们实现了SearchContact
方法。该方法接受一个姓名作为输入,并在二叉搜索树中递归搜索匹配的联系人。
func (n *AddressBookNode) SearchContact(name string) (string, bool) {
if n == nil {
return "", false
}
if name == n.Name {
return n.ContactInfo, true
}
if name < n.Name {
return n.Left.SearchContact(name)
}
return n.Right.SearchContact(name)
}
该方法的工作原理如下:
SearchContact
方法。SearchContact
方法。为了从联系簿中删除联系人,我们实现了DeleteContact
方法。该方法接受一个姓名作为输入,并在二叉搜索树中递归删除匹配的联系人。
func (n *AddressBookNode) DeleteContact(name string) *AddressBookNode {
if n == nil {
return nil
}
if name < n.Name {
n.Left = n.Left.DeleteContact(name)
} else if name > n.Name {
n.Right = n.Right.DeleteContact(name)
} else {
if n.Left == nil && n.Right == nil {
return nil
} else if n.Left == nil {
return n.Right
} else if n.Right == nil {
return n.Left
}
minNode := n.Right.FindMin()
n.Name = minNode.Name
n.ContactInfo = minNode.ContactInfo
n.Right = n.Right.DeleteContact(minNode.Name)
}
return n
}
该方法的工作原理如下:
DeleteContact
方法。DeleteContact
方法。通过构建高效的二叉搜索树联系簿,我们可以轻松地插入、搜索和删除联系人信息。使用适当的算法和数据结构,我们能够在O(log n)
的时间复杂度内执行这些操作。这对于需要频繁处理联系人信息的应用程序来说尤为重要。