LeetCode-543 二叉树的直径

题目描述

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

示例 :
给定二叉树

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

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

解题思路

利用递归的思路,从根节点开始,计算每个节点的高度:等于左右孩子节点的高度的最大值加1。
任意一条路径可以被写成两个 箭头(不同方向),每个箭头代表一条从某些点向下遍历到孩子节点的路径。
假设我们知道对于每个节点最长箭头距离分别为 L, R,那么最优路径经过 L + R + 1 个节点。
算法
按照常用方法计算一个节点的深度:max(depth of node.left, depth of node.right) + 1。在计算的同时,经过这个节点的路径长度为 1 + (depth of node.left) + (depth of node.right) 。搜索每个节点并记录这些路径经过的点数最大值,期望长度是结果 - 1。

代码实现

// C++版本
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* node, int& ans) {
        if (node == nullptr) return 0;
        int L = maxDepth(node->left, ans);
        int R = maxDepth(node->right, ans);
        ans = max(ans, L+R+1);
        return max(L, R)+1;
    }
    int diameterOfBinaryTree(TreeNode* root) {
        int ans = 1;
        maxDepth(root, ans);
        return ans-1;
    }
};
# python版本
# 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.res = 1
        def maxDepth(node):
            if node == None:
                return 0
            L = maxDepth(node.left)
            R = maxDepth(node.right)
            self.res = max(self.res, L+R+1)
            return max(L, R) + 1
        maxDepth(root)
        return self.res - 1

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可...
    topshi阅读 646评论 0 1
  • 目录 简书的 markdown 都不支持 [TOC] 语法……我就不贴目录了。下面按照类别,列出了29道关于二叉树...
    被称为L的男人阅读 3,380评论 0 8
  • 树的定义与基本术语   树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构。...
    java技术分享师阅读 1,136评论 0 1
  • 编译环境:python v3.5.0, mac osx 10.11.4 前述内容: 线性表 队列 堆栈 线性结构...
    掷骰子的求阅读 2,507评论 1 7
  • 阳光正好绿荫浓, 微风不燥夏日游。 逛山逛水汗满襟, 笑语吟吟乐无穷。
    狸歌_阅读 852评论 7 29