LeetCode #543 二叉树的直径 树 递归

LeetCode #543 二叉树的直径

题目描述

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

示例 :
给定二叉树

      1
     / \
    2   3
   / \     
  4   5    

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

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

思路分析

一条路径的长度为该路径经过节点数减一,所以求直径等效于求路径经过节点数的最大值减一。
而任意一条路径都可以看作是由某个节点为起点,从其左儿子和右儿子的路径拼接得到。
这样就可以定义一个递归函数 depth(node),函数返回该节点为跟的子树的深度,左儿子的深度 LL 加上右儿子的深度 RR11 就为该路径的节点数

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def diameterOfBinaryTree(self, root: TreeNode) -> int:
        self.ans = 1
        def depth(node):
            if node is None:
                return 0
            l = depth(node.left)
            r = depth(node.right)
            # 比较节点数大小,加上该根节点
            # 这里如果不+1最后返回就不用-1了,写成这样方便理解
            self.ans = max(self.ans, l + r + 1)
            return max(l, r) + 1
        depth(root)
        # 返回直径
        return self.ans - 1
  • 时间复杂度:O(N)O(N)
  • 空间复杂度:O(Height)O(Height)HeightHeight 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height)O(Height)
发布了95 篇原创文章 · 获赞 2 · 访问量 2085
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览