leetcode-543


543. 二叉树的直径

1 题目描述

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例1:

输入: [1, 2, 3, 4, 5]
输出: 3
解释: 最长的路径为[4,2,1,3]或[5,2,1,3]

注意:两结点之间的路径长度是以它们之间边的数目表示。

2 思路

  直接深度优先遍历,DFS函数返回的是当前子树的最长路径长度,即最多边的路径。很显然,当找到叶节点时,此时该子树上只有一个节点,因而返回0。而最长的路径可能是当前根节点和左右子树中的节点所构成,即最长的路径经过根节点;或是最长的路径存在于左子树或右子树中。

  思考一下,最长路径经过了某个”根节点”(这里的根节点是当前遍历到的节点),那么最长路径其实就是当前节点左右子树路径和,或左右子树路径长度中大者与其父节点相关的子树的路径长度和。因此,其实就是求当前节点(递归的当前层)的左右子树最长路径长度,而答案就是二者的和或是左右子树路径长度中较大者与上一层中的”子树”的路径加和。

int handle(struct TreeNode *root, int *cnt) {
    if(!root)   return -1;      // 空结点,返回-1,加完1后才是0条边
    else if (!root->left&&!root->right)   return 0; // 叶节点,无边

    int left = handle(root->left, cnt)+1;       // 左子树最长路径长度
    int right = handle(root->right, cnt)+1;     // 右子树最长路径长度
    *cnt = fmax(*cnt, left+right);              // 判断以过当前节点的路径是否为最长路径,是则更新答案
    return fmax(left, right);                   // 返回左右子树中的最长路径长度
}

int diameterOfBinaryTree(struct TreeNode* root){
    int ret = 0;
    handle(root, &ret);
    return ret;
}

文章作者: Vyron Su
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Vyron Su !