LeetCode刷题随笔1

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;
}

思路:将当前节点的左右子树深度相加,用深度遍历求出所有节点中的路径最大值

猜你喜欢

转载自www.cnblogs.com/iris-lin/p/12342954.html