【问题标题】:I want to add values while a recursive loop unfolds我想在递归循环展开时添加值
【发布时间】:2017-01-28 16:10:28
【问题描述】:

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

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。具体来说,提供重现问题所需的代码,以及到目前为止的跟踪输出。
  • “我需要一些帮助”不是问题陈述。你的代码做什么?您已经描述了每个阶段的预期,但简单的测试表明您的代码没有达到您的预期。

标签: python recursion binary-tree avl-tree


【解决方案1】:

您的直接问题是您似乎不了解局部变量和全局变量。 clcr 是局部变量;对于给定的控制流,它们唯一可以拥有的值是 0 和 1。请记住,例程的每个实例都会获得一组新的局部变量:您将它们设置为 0,也许递增到 1,然后返回。这不会影响函数其他实例中的变量值。

一个更深层次的问题是您没有考虑到更大的树。假设您确实学会了使用全局变量并纠正这些增量。以您当前的树为例,插入节点 4、9、10 和 11(非常平衡)。遍历您的算法,跟踪 clcr 的值。当你到达节点 10 时,cl 令人不安地超过了树的深度——我认为这是你逻辑中的一个致命错误。


再想一想:递归例程不应该有全局变量,除了动态编程实现的数据存储(这里不适用)。该函数应该检查基本情况并返回一些微不足道的东西(例如 0 或 1)。否则,该函数应该减少问题一个简单的步骤并再次出现;当递归返回时,函数对结果做一些简单的事情,并将新结果返回给它的父级。

你的任务比较简单:

Find the depths of the two subtrees.
If their difference > 1, return False
else return True

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

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 2017-08-02
    • 1970-01-01
    • 2018-07-10
    • 2022-10-04
    • 2020-11-09
    • 2018-06-27
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多