【问题标题】:How can I recursively insert the Fibonacci sequence into a binary tree如何递归地将斐波那契数列插入二叉树
【发布时间】:2012-03-03 10:34:49
【问题描述】:

希望有人能提供帮助,我不是程序员,但一直有兴趣探索斐波那契数列及其递归树...

我创建了一个二叉树类,以及一个关联的 TreeNode 类,并希望生成由以下人员创建的递归调用的二叉树:

f(n) = f(n-1) + f(n-2) 对于给定的 n 值

我想将它添加为二叉树类的 InsertFibonacci 方法,替换标准的 Insert 方法:

def insertNode(self, root, inputData):
    if root == None:
        return self.addNode(inputData)
    else:
        if inputData <= root.nodeData:
            root.left = self.insertNode(root.left, inputData)
        else:
            root.right = self.insertNode(root.right, inputData)
        return root

我可以在 Fib 函数中添加某种装饰器吗?

# Fib function
def f(n):

    def helper(n):
        left = f(n-1)
        right = f(n-2)
        return left,right

    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        left, right = helper(n)
        return left + right

【问题讨论】:

  • 你的意思是你想要一个数据结构来表示递归斐波那契函数的调用图吗?那么你不应该使用二叉 search 树。
  • 嗨 Larsmans,是的,一种表示调用图的数据结构。调用图不是代表了一个近乎完整的严格二叉树结构吗?
  • 是的,但是调用图不是二叉 search 树,insertNode 似乎实现了这一点。 BST 是带有排序约束的标记二叉树,斐波那契调用图没有显示。
  • 对,我明白其中的区别。非常感谢您的澄清。

标签: python data-structures fibonacci recursive-datastructures


【解决方案1】:

这是一种方法:

def insertFibonacci(self, n):
    current = self.addNode(n)
    if n > 1:
        current.left = self.insertFibonacci(n-1)
        current.right = self.insertFibonacci(n-2)
        # if you want the fibonacci numbers instead of the calls:
        # current.value = current.left.value + current.right.value
    return current

假设为正 n。 应该返回斐波那契调用树的根。

请注意,这不会是完全相同的二叉树;它不会满足二叉搜索树所做的排序不变量。我假设您只是为了方便而想使用现有的结构。

【讨论】:

  • 非常感谢@larsmans 我使用了你的 FibTree 类,它运行良好。我已经对其进行了修改,因此每个节点都包含对其父节点的引用:
【解决方案2】:

这是我能想到的最简单的解决方案:

class FibTree(object):
    def __init__(self, n):
        self.n = n
        if n < 2:
            self.value = n
        else:
            self.left = FibTree(n - 1)
            self.right = FibTree(n - 2)
            self.value = self.left.value + self.right.value

【讨论】:

  • 非常感谢 Tzaman 和 Larsmans 的快速解答!我会尝试这些解决方案。
  • 非常感谢@larsmans 我使用了你的 FibTree 类,它运行良好。我已经对其进行了修改,因此每个节点都包含对其父节点的引用: class FibTree(object): def __init__(self, n, parent): self.n = n self.parent = parent if n
  • 给定一个节点n,如何确定是左还是右?
  • 就像我在之前的评论中发布的一样。 def is_left_child(self): return self is self.parent.left(+ 捕获在根上调用它时引发的异常)。
  • 谢谢@larsmans。我稍微修改了这个以集成到您最初设置的类中:def is_left_child(self, root): """ Returns true if Node is a left child """ if root.parent: The next thing I need to figure out is out to graphically visualise the tree hierarchy, showing parent-child relationships. Currently I've just done a breadth first traversal, but this only gives me children on each level and not relationships. Thanks Alex return root is root.parent.left else: return False
猜你喜欢
  • 2013-03-14
  • 2016-02-21
  • 2011-07-27
  • 2012-11-19
  • 2016-11-07
  • 2012-02-16
  • 1970-01-01
  • 2010-12-03
相关资源
最近更新 更多