这是一种自下而上的方法来检查树是否是AVL树。所以这段代码的工作原理是:
假设这是一棵树:
8
3 10
2
1
检查叶节点是否为叶节点(此处为1)。然后,当具有数据2的节点是当前值时,它展开一次递归。 cl = 1的值,而它比较右树。 2的右分支是空的,即没有任何子代,因此avl_compare将允许(1,0)。
在此之后我想向cl添加一个值,以便当具有数据3的节点是当前值时,cl = 2的值.avl_check是一个赋值问题。我自己做了这个,但是我需要一些帮助才能使用递归函数。
def avl_check(self):
cl = cr = 0
if(self.left):
self.left.avl_check()
cl+=1
if(self.right):
self.right.avl_check()
cr += 1
if(not self.avl_compare(cl,cr)):
print("here")
答案 0 :(得分:1)
您当前的问题是,您似乎无法理解本地和全局变量。 cl 和 cr 是局部变量;使用给定的控制流,它们可以拥有的唯一值是0和1.请记住,例程的每个实例都获得一组新的局部变量:将它们设置为0,可能增加到1,然后返回。这 not 会影响函数其他实例中变量的值。
更深层次的问题是,您还没有想到更大的树木。假设您做学习使用全局变量并更正这些增量。拿走当前树,插入节点4,9,10和11(很好地平衡)。浏览您的算法,跟踪 cl 和 cr 的值。当你到达节点10时, cl 比树深度更令人不安 - 我认为这是你逻辑中的一个致命错误。
再次考虑一下:递归例程不应该有全局变量,除了动态编程实现的数据存储(这里不适用)。该函数应该检查基本情况并返回一些微不足道的东西(例如0或1)。否则,该函数应该减少问题一个简单的步骤并重复;当递归返回时,函数对结果执行简单的操作并将新结果返回给其父级。
您的任务相对简单:
Find the depths of the two subtrees.
If their difference > 1, return False
else return True
您应该已经知道如何检查树的深度。首先实现这一点。之后,使您的实现更加智能化:检查子树的深度还在每一步检查其平衡。这将是你的最终解决方案。