二叉树的直径

题目链接

二叉树的直径

题目描述

二叉树的直径_第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 res = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        dfs(root);
        return res;
    }

    public int dfs(TreeNode node){
        if(node != null){
            // 当前节点不为空
            int maxL = dfs(node.left);
            int maxR = dfs(node.right);
            // 当前节点的路径最大值等于左子树的最大边数加上右子树的最大边数
            int maxCur = maxL + maxR;
            res = maxCur > res ? maxCur : res;
            // 返回左右子树的最大边数为该点为左右子树的最大边数
            return Math.max(maxL, maxR) + 1;
        }
        // 当前节点为空返回0
        return 0;
    }
}

关键点

  • 理解深度优先遍历的思想
  • dfs最终返回的是该节点的最大边数,也就是左右子树的最大边数+1

你可能感兴趣的:(算法,算法,LeetCode,java,数据结构,深度优先遍历)