给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
首先,二叉树的实现是:
Code:
// Definition for a binary tree node
class TreeNode
{
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode()
{
this->val=0;
this->left=nullptr;
this->right=nullptr;
}
TreeNode(int x)
{
this->val=x;
this->left=nullptr;
this->right=nullptr;
}
TreeNode(int x,TreeNode *left,TreeNode *right)
{
this->val=x;
this->left=left;
this->right=right;
}
};
Method:递归遍历二叉树
Code:
class Solution{
public:
// 本题是递归遍历求二叉树高度的变体
// 返回从某节点出发,左右子树高度之和的最大值即为题目中要求的二叉树直径
// 全局变量存储二叉树的最大直径
// 记录当前节点间的最大距离
int width=0;
// 获得以当前节点为根节点的二叉树的高度(宽度)
int ObtainHigh(TreeNode *root){
if(root==nullptr){
return 0;
}
return max(ObtainHigh(root->left),ObtainHigh(root->right))+1;
}
// 计算以当前节点为根节点的二叉树的左右子树之和,并更新当前节点间的最大距离
void ObtainNodeWidth(TreeNode *root){
if(root==nullptr){
return;
}
if((ObtainHigh(root->left)+ ObtainHigh(root->right))>width){
width=ObtainHigh(root->left)+ ObtainHigh(root->right);
}
// 递归遍历左子树
ObtainNodeWidth(root->left);
// 递归遍历右子树
ObtainNodeWidth(root->right);
}
int diameterOfBinaryTree(TreeNode *root){
ObtainNodeWidth(root);
return width;
}
};
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/diameter-of-binary-tree