以下是Scala中的一个程序。
def range(low : Int, high : Int) : List[Int] = {
var result : List[Int] = Nil
result = rangerec(root, result, low, high)
result
}
private def rangerec(r : Node, l : List[Int], low : Int, high :Int) : List[Int] = {
var resultList : List[Int] = List()
if(r.left != null) {
rangerec(r.left, resultList, low, high)
} else if(r.right != null) {
rangerec(r.right, resultList, low, high)
} else {
if(r.key >= low && r.key <= high) {
resultList = resultList ::: List(r.key)
resultList
}
}
resultList
}
我在二叉搜索树中创建了范围方法,实现了有序遍历算法。所以它必须以递归方式工作,但它不会打印任何东西,List()。如何修复我的算法?或编辑我的代码?
答案 0 :(得分:3)
我不知道scala,但你需要使用list l
作为参数传递给递归函数并使用rangerec
函数的输出。
private def rangerec(r : Node, l : List[Int], low : Int, high :Int) : List[Int] = {
var resultList : List[Int] = l
if(r.left != null) {
resultList = rangerec(r.left, l, low, high)
} else if(r.right != null) {
resultList = rangerec(r.right, l, low, high)
} else {
if(r.key >= low && r.key <= high) {
resultList = l ::: List(r.key)
}
}
resultList
}
答案 1 :(得分:0)
在函数外部定义你的resultList,因为我看到你将结果附加到这个变量。顺便说一句,顺序遍历遵循此规则。访问左,访问Root,最后访问Right。但是从代码(虽然我不知道scala),我可以破译你正在访问左,右,最后根。
等效的递归有序打印javacode看起来像这样
public void printOrdered(Node node){
if(node.left != null){
printOrdered(node.left); //VISIT LEFT
}
System.out.println(node.data); //VISIT ROOT AND PRINT
if(node.right!=null){
printOrdered(node.right); //VISIT RIGHT
}
}
因此,scala可能看起来像这样(语法可能有误)
private def rangerec(r : Node) : Void = {
if(r.left != null) {
rangerec(r.left)
}
resultList = resultList :: List(r.key)
if(r.right != null) {
rangerec(r.right)
}
}
这里resultList是List类型的变量,应该从外部传递。