543. 二叉树的直径 + 树递归

543. 二叉树的直径

LeetCode_543

题目描述

代码实现

  1. 代码撰写的时候需要注意的是left+right+1会多算一个结点。
  2. 在返回最终答案的时候需要减去一个结点(树的高度决定的)。
/**
 * 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 maxSum = 1;
    public int diameterOfBinaryTree(TreeNode root) {
        dfs(root);
        return maxSum - 1;
    }
    public int dfs(TreeNode root){
        if(root == null)
            return 0;
        int left = dfs(root.left);
        int right = dfs(root.right);
        maxSum = Math.max(maxSum, left + right + 1);
        return Math.max(left, right) + 1;
    }
}

复杂度分析

  • 时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
  • 空间复杂度:O(Height),其中 Height 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height) 。
posted @ 2021-03-15 21:30  Garrett_Wale  阅读(59)  评论(0编辑  收藏  举报