leetcode中,遇到了一个以前没有见过的题,难度标记: easy,通过率(Acceptance):46.2%,虽然难度上看起来并不是很难,但是题目的内容还是第一次见到,这里记录一下,同时也分享给大家,欢迎批评指正。
题目描述
题目的原文描述是这样的:
Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.
这个题目的大致意思如下:给出一个二叉树,我们需要计算整个二叉树”直径“的长度。二叉树”直径“的长度被定义为:二叉树中任意2个节点路径长度的最大值,这个路径可能经过也可能不会经过根节点。
解题思路
首先明确一点:这个题目中所描述的路径,并没有要求必须是从上到下的。只要是任意2个节点就可以,这个我们来看一下具体的应用例子。
对于上面的二叉树,我们可以看到整个二叉树中最长的路径可以表示为[7,4,5,-2],最长的路径并没有经过根节点。
在上面的情况是不经过根节点的情况,下面举出另外一种情况,经过根节点。
上面的情况下,最长路径是经过根节点的,最长路径可以表示为[4,2,1,3]或者[5,2,1,3]。
经过上面的分析我们可以看到整个题目需要考虑的情况,很明显可以看到,这个题目是可以用递归的思想来进行解答的,具体的思路,我们可以总结到:
- 对于每个节点来说,每个当前节点下的最大的长度 = 左子树的高度+ 右子树的高度。
- 对于每个节点来说,需要比较当前节点的最大长度是否是最大的,如果是最大则需要改变全局的最大值。
经过上面的思路,我们就可以看到,这个题目实际上就是求二叉树高度的一个变种而已。
程序代码
这里我们主要采用了C语言来写(主要是涉及到指针的操作),下面我贴出整个程序的源代码,供大家参考。
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int test(struct TreeNode * root, int * max){
if(root == NULL)
return 0;
else{
int deepth = 0; // 记录当前节点下的长度
int left_deepth = test(root->left, max); //求左子树高度
int right_deepth = test(root->right, max); // 求右子树高度
deepth += left_deepth;
deepth += right_deepth; // 求出当前节点下的最大长度
if(deepth > *max) // 与最大长度进行比较
*max = deepth;
return (left_deepth > right_deepth ? left_deepth : right_deepth) + 1; // 返回当前节点的高度
}
}
int diameterOfBinaryTree(struct TreeNode* root) {
int max = 0;
test(root, &max);
return max;
}