老师好,我再看了这一章之后,自己实现这个二分搜索树的floor与ceil方法,但在做条件判断的时候,发现很麻烦,代码写得也比较繁琐,也没有想到简化的思路。但我觉得不应该这么复杂,所以想请老师帮我看看这两个地方的代码应该怎么优化
floor:
// 查找二分搜索树指定元素floor
func (tree *BasicTree) floor(node *Node, e interface{}) *Node {
if node == nil {
return nil
}
// 判断,如果e<node.element,则其floor肯定在node的左子树中
// 递归退出条件:找到floor则退出,这里退出有两种情况
// 1. e < node.element的情况下,node.left==nil,说明没有floor节点,最小的节点元素都比e大
if interfaces.Compare(e, node.Element) == -1 && node.Left == nil {
return nil
}
// 2. e > node.element的情况下,e<node.right.element或者node.right==nil,此时当前node就是e的floor节点
if interfaces.Compare(e, node.Element) == 1 && (node.Right == nil || (interfaces.Compare(e, node.Right.Element) == -1 &&((node.Right.Left == nil) || interfaces.Compare(node.Right.Left.Element, e)== 1))) {
// 写法太麻烦,需要优化
return node
}
// 3. e等于node.element,e的节点就是其本身
if interfaces.Compare(e, node.Element) == 0 {
return node
}
// 4. 递归调用
if interfaces.Compare(e, node.Element) == 1 {
return tree.floor(node.Right, e)
} else {
return tree.floor(node.Left, e)
}
}
ceil:
// 查找二分搜索树指定元素(FN)的ceil节点
func (tree *BasicTree) ceil(node *Node, e interface{}) *Node {
if node == nil {
return nil
}
// 递归终止条件
// 1. FN > node.element 分情况判断
// 1. node.Right == nil, 表示没有满足条件的ceil,因为整个二分搜索树都比该节点小
if interfaces.Compare(e, node.Element) == 1 && node.Right == nil {
return nil
}else if (interfaces.Compare(e, node.Element) == -1 && (node.Left == nil || (interfaces.Compare(e, node.Left.Element) == 1 && (node.Left.Right == nil || interfaces.Compare(node.Left.Right.Element, e) == -1)))){
// 写法太麻烦,需要优化
return node
}
// 3. FN = node.element, node就是FN的ceil
if interfaces.Compare(e, node.Element) == 0 {
return node
}
// 4. 递归调用(缩减规模)
if interfaces.Compare(e, node.Element) == 1 {
return tree.ceil(node.Right, e)
} else {
// FN(e)<node.Element
return tree.ceil(node.Left, e)
}
}
代码是用go实现的,就是我在代码中标注写法太麻烦的地方
- floor:比指定元素小的最大的元素
这个是我的判断思路,老师能不能帮忙看一下,谢谢啦