树的路径长度的递归定义

时间:2012-09-21 11:15:52

标签: algorithm recursion tree

计算树的路径长度的一种有效方法是对所有k求和k的乘积和k级节点的数量。

树的路径长度是所有树节点的级别之和。路径长度可以具有简单的递归定义,如下所示。

具有N个节点的树的路径长度是其根的子树的路径长度加上N-1的总和。

我无法遵循上述递归定义。请用简单的例子来解释。

2 个答案:

答案 0 :(得分:13)

了解递归

  

路径长度可以具有简单的递归定义,如下所示。

     

具有N个节点的树的路径长度是其根的子树的路径长度加上N-1的总和。

首先,您必须了解路径长度是什么:它是节点和根之间所有距离的总和。

考虑到这一点,可以看出没有子节点的根节点的路径长度为0是微不足道的:没有与根节点有距离的节点。

假设我们已经知道了一些树的路径长度。如果我们要创建一个新节点R,我们连接所有已经存在的树,请考虑到根节点的距离如何变化。

以前,距离是根据树的根来衡量的(现在是子树)。现在,还有一个步骤要对根节点进行,即所有距离都增加一个。

因此,我们添加N - 1,因为根节点有N - 1个后代,现在距离根更远,1*(N-1) = N-1


您可以通过多种方式轻松计算路径长度,您可以计算边缘或节点。

计算节点

             A        Level 0
           /   \      
          B     C     Level 1
         / \   / \
        D   E F   G   Level 2

我们从路径长度0开始:

  • 节点A是根,它始终在0级。它不会影响路径长度。 (您不需要按任何路径到达它,因此0)
    • 0 + (0) = 0
  • 在第1级,您有两个节点:BC
    • 0 + (1 + 1) = 2
  • 在第2级,您有四个节点:D, E, FG
    • 2 + (2 + 2 + 2 + 2) = 10

计算边

             A        
           /   \      Level 1
          B     C     
         / \   / \    Level 2
        D   E F   G
  • 0,我们的初始金额
  • + 1*21级,有2条边
  • + 2*42级,有4条边

将定义翻译成数学

  

计算树的路径长度的一种有效方法是对所有k求和k的乘积和k级节点的数量。

设L i 表示级别i上的节点集,h表示高度,即从节点到根的最大距离:

enter image description here

答案 1 :(得分:1)

             A
           /   \
          B     C
         / \   / \
        D   E F   G

这里,N =总数。树中的节点数= 7

(叶子节点的路径长度取为零。)

度Acc。递归定义:

Path length of tree = Path length with Root A
                    = Path length with Root B + Path length with Root C + (7-1)

                    = (Path length with Root D + Path length with Root E + (3-1))
                    + (Path length with Root F + Path length with Root G + (3-1))
                    + (7-1)

                    = ((0 + 0 + 2) + (0 + 0 + 2)) + 6
                    = 10

其实施可以如下:

int Recurse(Node root, int totalNodes)
{
    if (totalNodes == 1)
        return 0;
    int noOfNodes1 = CountNodes(root.left);
    int noOfNodes2 = CountNodes(root.right);
    return ( Recurse(root.left, noOfNodes1)
           + Recurse(root.right, noOfNodes2) + totalNodes - 1);
}