543. 二叉树的直径

170 阅读1分钟

题目介绍

力扣543题:leetcode-cn.com/problems/di…

image.png

分析

该题跟之前的[124. 二叉树中的最大路径和]的思路是一样的,一个节点只有两条路可选,要么走左子树,要么走右子树,不能出现继走左子树,又走右子树的情况。

所以我们首先定义一个递归函数,表示当前节点能向根节点贡献的最大路径。如下图所示

image.png

即当前所能向根节点贡献的最大路径为:Math.max(左子树贡献的最大路径,右子树的贡献的最大路径) + 1,而已该节点为根节点的直径 = 左子树贡献的最大路径 + 右子树的贡献的最大路径。

代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int result = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        if(root == null) {
            return 0;
        }
        tranverse(root);
        return result;
    }

    public int  tranverse(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int left = tranverse(root.left);
        int right = tranverse(root.right);
        int temp = left + right;
        //更新二叉树的直径值
        result = Math.max(result , temp);
        //计算当前节点贡献的最大路径
        return Math.max(left , right) + 1;
    }
}