【问题标题】:recursive definition of path length of a tree树的路径长度的递归定义
【发布时间】:2012-09-13 19:27:30
【问题描述】:

计算树的路径长度的一种简便方法是对所有 k 求和,将 k 与第 k 层节点数的乘积相加。

一棵树的路径长度是树的所有节点的层级之和。路径长度可以有如下简单的递归定义。

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

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

【问题讨论】:

  • 空树或普通二节点树的路径长度是多少?只有这样,递归定义才完成。我不太明白这个路径长度是多少或它的用途,但如果您认为具有 N 个顶点的树有 N-1 条边,它可能会有所帮助。
  • @bixilop:我在上面添加了一些信息。希望对回答有帮助

标签: algorithm recursion tree


【解决方案1】:
             A
           /   \
          B     C
         / \   / \
        D   E F   G

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

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

累加。递归定义:

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);
}

【讨论】:

  • 你的解释是错误的。在您的示例中,有子树 B 和 C。它们的路径长度均为 2:3 个节点 - 1。现在,对于整个子树,它是 7 - 1 + 两个子树 = 10。
  • 不,是10。你犯的错误是只有一个节点的树的路径长度是0,而不是1
  • 你的意思是叶子节点处于零级吗?如果是,那么可能是 10。
  • 仍然不正确:应该没有。一棵只有一个节点的树的路径长度为 0。从它到子树 B 是:0 + (3-1)=2。
  • 是的,subtree starting at <leaf node>的路径长度是(1-1) = 0
【解决方案2】:

理解递归

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

具有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*2在水平1,有2
  • + 2*4在水平2,有4

将定义转化为数学

计算树的路径长度的一种简便方法是对所有 k 求和,将 k 与第 k 层节点数的乘积相加。

令Li 表示i 层上的节点集,h 表示高度,即从节点到根的最大距离:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2016-02-09
    • 1970-01-01
    • 2017-09-24
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多