3.没有重复的节点。
type AddressBookNode struct { Name string ContactInfo string Left *AddressBookNode Right *AddressBookNode }插入联系人
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 }该方法的工作原理如下:
3.返回修改后的节点。请注意,尽管在递归调用期间可能会修改树的结构,但根节点保持不变,并且返回修改后的树。
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) }该方法的工作原理如下:
4.如果目标姓名与当前节点的姓名相等,则表示找到了要搜索的联系人节点。方法返回该节点的联系信息和true。
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 }该方法的工作原理如下:
4.3如果目标节点有两个子节点,则找到右子树中的最小节点,将其值复制到目标节点,并递归删除最小节点。