LeetCode 574
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
1.求树木的最大深度
int diameterOfBinaryTree(struct TreeNode* root){
if(root==NULL)
return 0;
else if (root->left==NULL&&root->right==NULL) //单单一个树节点
return 1;
int left_hight=diameterOfBinaryTree(root->left);
int right_hight=diameterOfBinaryTree(root->right);
if(left_hight>right_hight)
return left_hight+1;
else
return right_hight+1;
}
2.结合DFS遍历和求树的最大深度,求树的任意两个节点之间的最大直径
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int res; //全局变量记录路径长度 此处设置成0
int DFS(struct TreeNode*root)
{
if(root==NULL)
return 0;
if(root->left==NULL&&root->right==NULL)
return 1;
int left=DFS(root->left);
int right=DFS(root->right);
res=res>(left+right)?res:left+right;
return (left>right?left:right)+1; //返回当前节点的深度
}
//可以转化为求左右子树的高度,返回两者中最大的
int diameterOfBinaryTree(struct TreeNode* root){
if(root==NULL)
return 0;
res=0; //和此处设置成0的有什么区别?????
int length=DFS(root);
return res;
}
思路:将当前节点的左右子树深度相加,用深度遍历求出所有节点中的路径最大值