gpt4 book ai didi

Swift 二进制搜索树搜索

转载 作者:行者123 更新时间:2023-11-28 10:56:34 25 4
gpt4 key购买 nike

我正在尝试实现一个存储单词列表的 BST。我知道我的树结构是正确的,因为当我尝试按顺序遍历和打印时,列表按字母顺序打印。但是,我用于在树中查找元素的搜索函数每次都返回 false。

func search(searchValue: String) -> Bool? {
if searchValue == value as! String{
return true
}

if searchValue < value as! String {
return left?.search(searchValue: searchValue)
}
if searchValue > value as! String{
return right?.search(searchValue: searchValue)
}

return false


}

函数在这个循环中被调用。不在 BST 中的每个单词都应附加到数组 misspelled 中。当前没有单词附加到数组。输入数组是要针对 BST 检查的所有单词的数组。

 for item in arrayInput
{
let target = item.lowercased()//reversed
let inTree = tree.search(searchValue: target)
if inTree == false
{
misspelled.append(item)
}
}

上下文的更多 BST 类:

  public class BinarySearchTree<T: Comparable> {
fileprivate(set) public var value: T
fileprivate(set) public var parent: BinarySearchTree?
fileprivate(set) public var left: BinarySearchTree?
fileprivate(set) public var right: BinarySearchTree?


public init(value: T) {
self.value = value
}

public convenience init(array: [T]) {
precondition(array.count > 0)
self.init(value: array.first!)
for v in array.dropFirst() {
insert(value: v)
}
}

}
public func insert(value: T) {
if value < self.value {
if let left = left {
left.insert(value: value)
} else {
left = BinarySearchTree(value: value)
left?.parent = self
}
} else {
if let right = right {
right.insert(value: value)
} else {
right = BinarySearchTree(value: value)
right?.parent = self
}
}
}

最佳答案

我对你的代码做了一些改进,看看:

public class BinarySearchTree<T: Comparable> {
fileprivate(set) public var value: T
fileprivate(set) public var parent: BinarySearchTree?
fileprivate(set) public var left: BinarySearchTree?
fileprivate(set) public var right: BinarySearchTree?


public init(value: T) {
self.value = value
}

public convenience init(array: [T]) {
precondition(array.count > 0)
self.init(value: array.first!)
for v in array.dropFirst() {
insert(value: v)
}
}

// Refactored out common code to reduce duplicaiton
public func insert(value: T) {
let nodeToModify = value < self.value ? left : right

if let nodeToModify = nodeToModify {
nodeToModify.insert(value: value)
}
else {
let subtree = BinarySearchTree(value: value)
subtree.parent = self
self.left = subtree
}
}


// Why constrain searching to just Strings? Keep it generic to all T: Comparable
func search(for searchValue: T) -> Bool {
if searchValue == value { return true }

if searchValue < value {
return left?.search(for: searchValue) ?? false
}
if searchValue > value {
return right?.search(for: searchValue) ?? false
}

return false
}
}

// Move the `search` function outside of the class, and into an extension
// with the constaint that `T == String`
extension BinarySearchTree where T == String {
func search(for searchValue: String) -> Bool {
if searchValue == value { return true }

if searchValue < value {
return left?.search(for: searchValue) ?? false
}
if searchValue > value {
return right?.search(for: searchValue) ?? false
}

return false
}
}

关于Swift 二进制搜索树搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43147980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com