给定最小值构造斐波那契树的算法

时间:2019-06-01 20:18:48

标签: algorithm recursion binary-tree fibonacci

我想制作一棵斐波那契树,但最少要有1个树,我似乎找不到任何东西。

这是一个具有最小节点1的“正常”斐波那契树的示例。

        5
      /   \
     3     7
   /   \  /
  2    4 6
 /
1

例如,我想做的是至少3:

高度为0:的将是空树。

高度为1:

3

身高2:

   4
  /
 3

身高3:

     5
   /   \
  4     6
 /
3

身高4:

         7
      /    \
     5      9
   /   \   /
  4    6  8 
 /
3  

...等等。

我的问题是,我似乎看不到其中的模式,因此我无法想到要编写的算法。

我知道左子树的高度为h-1(其中h是原始给定的高度),右子树的高度为h-2。而且我看不到他们如何计算根数。但是除此之外,我真的很困。

1 个答案:

答案 0 :(得分:0)

由于斐波那契树是一个递归定义的结构,所以最简单的方法是考虑一个递归算法。

这是某种C风格的伪代码(不涉及任何极端情况-我将其留给您作为练习的一部分)。

function createTree(height)
{
  // basic cases
  if(height == 0) return NULL;
  if(height == 1)
  {
    node = new Node;
    node.numNodesInTree = 1;
  }
  else
  {
    // according to the definition of the fibonacci tree
    node = new Node;
    node.leftChild  = createTree(height - 1);
    node.rightChild = createTree(height - 2);
    node.numNodesInTree =   node.leftChild.numNodesInTree
                          + node.rightChild.numNodesInTree
                          + 1; // also count the current node
  }
  return node;
}

您最终得到一棵具有斐波那契结构的树,但还没有正确的数字。作为小帮手,您可以获得每个子树的节点数。

然后您可以执行以下操作:

function fillTree(offset, node, minimum) // offset means "all numbers in this subtree must be bigger than offset"
{
  // According to the binary search tree definition,
  // all numbers in the left sub tree have to be lower than
  // the current node.
  // All nodes in the right sub tree have to be larger.
  node.value =   node.leftChild.numNodesInTree // the number has to be bigger than all numbers in the left sub tree
               + 1                             // (that's the "one bigger")
               + offset                        // offset for right subtrees
               + minimum - 1;                  // Just stupidly add the minimum (as mentioned in the comment to your question)
  fillTree(offset, node.leftChild, minimum);      // propagate offset to left children
  fillTree(node.value, node.rightChild, minimum); // for the right sub tree, the current node's value is the new offset
                                                  // because all nodes in the right sub tree have to be bigger than the current node (binary search criterion)
}

然后您可以这样称呼它:

root = createTree(height);
fillTree(0, root, 3); // when initially calling it, the offset is always 0
                      // You can set the minimum arbitrarily (i.e. 3 as in your example)

由于这是伪代码,我显然没有对其进行测试,但是您可以从中得到启发。