求一棵树的直径
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,因此不会计算在内。您有两种选择:
- 更改
hieghtoftree
以返回最深路径上的节点数,而不是"跃点数" - 在求和中解决此问题
.
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,最大值(直径,直径));
结果将是路径上的边数。如果您计算节点数,则根据需要从最终结果中加一个或减一个。
相关文章:
- 检查 2 棵树是否具有相同的顺序
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- C++|以一种很好的方式将树(不一定是二进制的)打印到stdout
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 我该如何平衡一棵退化的树?C++数据结构
- 在两棵二元树中计数相等的节点
- 重建一棵树
- 如何从正常的BST继承一棵红黑树
- 从森林里造一棵n元树
- 二进制搜索树 - 将一棵树复制到另一棵树中
- C 复制一棵二进制树
- 找出两棵树是同构的
- 求一棵树的直径
- 在C++中从预购中构建一棵树
- 遍历一棵 n 元树
- 如何在C++中使用双(**)指针来处理一般的树数据结构
- 如何检查一棵树是否是另一棵树的子树
- 如何将一棵树划分为两个子树
- 在一棵有191个节点且高度为9的二叉树中找到一个键所需的最大比较次数是多少?
- 离散集数据结构:跟踪每棵树的大小