力扣543. 二叉树的直径(java DFS解法)

Problem: 543. 二叉树的直径

文章目录

题目描述

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

思路

本题目要求我们求取二叉树中最长的路径 ,可将其按递归 的思想分解成的最小子问题如下:

1.求取左子树的最长路径

2.求取右子树的最长路径

3.合并求取树的最长路径

解题方法

1.定义成员变量result记录最长"直径"

2.编写递归代码,依次得到左右子树的最长"直径"

3.将左右子树的最长"直径"合并得到当前的最长"直径",并与result比较更新

4.在归的过程中返回当前左右子树的最长路径加一(因为此时要回退到上一个节点,所以要加一!!!)

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( h ) O(h) O(h) h h h为树的高度

Code

java 复制代码
/**
 * 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 {
    //Recode the longest diameter
    private int result = 0;

    /**
     * Gets the path length between any two nodes of a tree
     *
     * @param root The root node of a tree
     * @return int
     */
    public int diameterOfBinaryTree(TreeNode root) {
        claMaxHeight(root);
        return result;
    }

    /**
     * Recursively gets the longest path containing the root node
     *
     * @param root The root node of a tree
     * @return int
     */
    public int claMaxHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //Gets the longest path of the left and right subtree
        int maxLeftHeight = claMaxHeight(root.left);
        int maxRightHeight = claMaxHeight(root.right);
        //Get the longest path("diameter")
        int diameter = maxLeftHeight + maxRightHeight;
        //Update the longest path("diameter")
        if (diameter > result) {
            result = diameter;
        }
        return Math.max(maxLeftHeight, maxRightHeight) + 1;
    }
}
相关推荐
ayt0073 分钟前
Netty AbstractNioChannel源码深度剖析:NIO Channel的抽象实现
java·数据库·网络协议·安全·nio
Gofarlic_OMS3 分钟前
装备制造企业Fluent许可证成本分点典型案例
java·大数据·开发语言·人工智能·自动化·制造
倦王9 分钟前
力扣日刷47
算法·leetcode·职场和发展
码王吴彦祖13 分钟前
顶象 AC 纯算法迁移实战:从补环境到纯算的完整拆解
java·前端·算法
Q741_14743 分钟前
每日一题 力扣 3655. 区间乘法查询后的异或 II 模拟 分治 乘法差分法 快速幂 C++ 题解
c++·算法·leetcode·模拟·快速幂·分治·差分法
开心码农1号1 小时前
Java rabbitMQ如何发送、消费消息、全套可靠方案
java·rabbitmq·java-rabbitmq
蜡台1 小时前
JetBrains IDEA 安装 卸载相关总结
java·ide·intellij-idea·注册码
WJLSH1231 小时前
TomCat
java·tomcat
戮戮2 小时前
Spring Cloud Gateway 零拷贝参数校验:一种高性能网关架构实践
java·网络·架构·gateway
abant22 小时前
leetcode 239 单调队列 需要一些记忆
算法·leetcode·职场和发展