我希望在递归循环展开时添加值

时间:2016-09-20 16:15:40

标签: python recursion binary-tree avl-tree

这是一种自下而上的方法来检查树是否是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")

1 个答案:

答案 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

您应该已经知道如何检查树的深度。首先实现这一点。之后,使您的实现更加智能化:检查子树的深度在每一步检查其平衡。这将是你的最终解决方案。