描述

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

示例 :
给定二叉树

1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

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

解析

直觉是求给定树的左右子树的最大深度和。其实不尽然,也有可能单单在给定树的一边,所以需要记录一下当前子树的左右子树的最大深度和。

代码

private int maxHeight = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        if (null == root) {
            return 0;
        }
        diameterOfBinaryTreeH(root);
        return maxHeight;
    }

    public int diameterOfBinaryTreeH(TreeNode root) {
        if (null == root) {
            return 0;
        }
        int leftNum = diameterOfBinaryTreeH(root.left);
        int rightNum = diameterOfBinaryTreeH(root.right);
        maxHeight = Math.max(leftNum + rightNum, maxHeight);//因为最长的直径也能在当前子树的左右子树上
        return Math.max(leftNum, rightNum) + 1;
    }

 

posted on 2019-12-18 17:34  反光的小鱼儿  阅读(167)  评论(0编辑  收藏  举报