如何在单个函数中递归计算 AVL-Tree 节点的平衡? (Python)
How to calculate balance of AVL-Tree node recursively and in a single function? (Python)
这里是第一个问题,所以如果我遗漏了一些重要的事情,请告诉我。
我有一个平衡的 AVL 树,我需要创建一个函数来计算单个给定节点的平衡。这需要在单个函数中发生,并且 递归地 。 (顺便说一句,这是在Python中)
我还包含了节点的实例化方法class,以便您可以看到节点的属性。
到目前为止,我已经想出了这个,虽然它有效,但它仍然不符合标准:
class Node:
def __init__(self, value, root):
self.value = value # Node value
self.left = None # Left child
self.right = None # Right child
self.root = root # Stores the original root of the tree
def getBalance(self, node):
return self.getTreeHeight(node.right)-self.getTreeHeight(node.left)
def getTreeHeight(self, rootnode):
if rootnode == None:
return -1
else:
return max(self.getTreeHeight(rootnode.left), self.getTreeHeight(rootnode.right)) + 1
如有任何提示,我们将不胜感激。
我所需要的只是朝着正确的方向轻推,因为老实说,我有点难过。
提前致谢!
首先是对您的实施的一些一般性评论:
为每个节点提供一个指向树根的指针是不寻常的。如果您决定在树的顶部添加一个新节点,使当前根成为新节点的子节点,这是非常不切实际的。然后你将不得不访问每个节点来更新对根的引用。
这两个方法都以一个节点为参数,可惜,因为self
已经是一个节点,所以那个节点可能是手术的对象。这需要对 getTreeHeight
进行微小的更改,因为您当前允许参数为 None
。但最后最好让这些方法在没有参数的情况下工作(self
除外)。
现在进入正题。不可能写出只调用自身而不传递或return任何额外信息的getBalance
方法。这是因为平衡的概念不是归纳的:如果您知道给定节点的子节点的平衡,那么此信息对于确定节点本身的平衡是没有用的。所以你需要以某种方式传递一些额外的信息。
实现此目的的一种方法是向 getBalance
添加一个可选参数,它将指示该函数是否被递归调用。如果递归,它可以 return 高度,如果不是,则平衡。这样你实际上合并了你已经写的两个函数:
def getBalance(self, recurring=False):
left = self.left.getBalance(True) if self.left else 0
right = self.right.getBalance(True) if self.right else 0
return max(left, right) + 1 if recurring else right - left
呼叫为:
node = root.left.right.right # get a reference to some node in your tree
balance = node.getBalance() # get the balance of that node (no argument!)
这里是第一个问题,所以如果我遗漏了一些重要的事情,请告诉我。 我有一个平衡的 AVL 树,我需要创建一个函数来计算单个给定节点的平衡。这需要在单个函数中发生,并且 递归地 。 (顺便说一句,这是在Python中)
我还包含了节点的实例化方法class,以便您可以看到节点的属性。 到目前为止,我已经想出了这个,虽然它有效,但它仍然不符合标准:
class Node:
def __init__(self, value, root):
self.value = value # Node value
self.left = None # Left child
self.right = None # Right child
self.root = root # Stores the original root of the tree
def getBalance(self, node):
return self.getTreeHeight(node.right)-self.getTreeHeight(node.left)
def getTreeHeight(self, rootnode):
if rootnode == None:
return -1
else:
return max(self.getTreeHeight(rootnode.left), self.getTreeHeight(rootnode.right)) + 1
如有任何提示,我们将不胜感激。 我所需要的只是朝着正确的方向轻推,因为老实说,我有点难过。
提前致谢!
首先是对您的实施的一些一般性评论:
为每个节点提供一个指向树根的指针是不寻常的。如果您决定在树的顶部添加一个新节点,使当前根成为新节点的子节点,这是非常不切实际的。然后你将不得不访问每个节点来更新对根的引用。
这两个方法都以一个节点为参数,可惜,因为
self
已经是一个节点,所以那个节点可能是手术的对象。这需要对getTreeHeight
进行微小的更改,因为您当前允许参数为None
。但最后最好让这些方法在没有参数的情况下工作(self
除外)。
现在进入正题。不可能写出只调用自身而不传递或return任何额外信息的getBalance
方法。这是因为平衡的概念不是归纳的:如果您知道给定节点的子节点的平衡,那么此信息对于确定节点本身的平衡是没有用的。所以你需要以某种方式传递一些额外的信息。
实现此目的的一种方法是向 getBalance
添加一个可选参数,它将指示该函数是否被递归调用。如果递归,它可以 return 高度,如果不是,则平衡。这样你实际上合并了你已经写的两个函数:
def getBalance(self, recurring=False):
left = self.left.getBalance(True) if self.left else 0
right = self.right.getBalance(True) if self.right else 0
return max(left, right) + 1 if recurring else right - left
呼叫为:
node = root.left.right.right # get a reference to some node in your tree
balance = node.getBalance() # get the balance of that node (no argument!)