求一棵树的直径

Finding Diameter of a Tree

本文关键字:一棵树      更新时间:2023-10-16

我写了代码来查找二叉树的直径。但是我无法弄清楚哪里出了问题.我编写的两个函数及其定义如下:-

    int btree::diameteroftree(node* leaf)
    { 
     if (leaf==NULL) 
     return 0;
     int lheight = hieghtoftree(leaf->left);
     int rheight = hieghtoftree(leaf->right);
     int ldiameter = diameteroftree(leaf->left);
     int rdiameter = diameteroftree(leaf->right);
     return max(lheight + rheight + 1,max(ldiameter,rdiameter));
   }

   int btree::hieghtoftree(node* leaf)
   {
    int left=0,right=0;
    if(leaf==NULL)
    return -1;
    else
    {
     left=hieghtoftree(leaf->left);
     right=hieghtoftree(leaf->right);
     if(left > right)
     return left +1;
     else
     return right+1;   
    }
   }

无法弄清楚我在这里哪里出错了.有人可以让我知道...

您希望返回最长路径上的节点数。因此,您的算法中的问题是以下行:

return max(lheight + rheight + 1,max(ldiameter,rdiameter));

哪里

rootDiameter = lheight + rheight + 1

是从左树的最深节点到右树最深节点的路径长度。但是,此计算不正确。单个节点返回的高度为 0,因此不会计算在内。您有两种选择:

  1. 更改hieghtoftree以返回最深路径上的节点数,而不是"跃点数"
  2. 在求和中解决此问题

.

return max(lheight + rheight + 3,max(ldiameter,rdiameter));

在有向的根树中,任何一对节点之间总是最多只有一条路径,并且到任何节点的最长路径总是从根开始。因此,直径只是整个树height(root)的高度,可以用递归计算

height(leaf) = 0
height(node) = max(height(node.left), height(node.right)) + 1

编辑:您在评论中链接到的页面描述了无向树的直径。您需要不同的树表示形式,例如邻接矩阵。

考虑一个 3 节点树,根 R 和 2 个叶子 L1、L2。那么高度树(L1) == 高度树(L2) == -1。因此,Diameteroftree(R) 将是 (-1)+(-1)+1 = -1 ?!?

我建议返回 -1; -->返回 0;和返回最大值(高度 + 高度 + 1,最大值(直径,直径));--> 返回最大值(高度 + 高度 + 2,最大值(直径,直径));

结果将是路径上的边数。如果您计算节点数,则根据需要从最终结果中加一个或减一个。