Diameter of Binary Tree(leetcode)

Diameter of Binary Tree

  leetcode中,遇到了一个以前没有见过的题,难度标记: easy,通过率(Acceptance):46.2%,虽然难度上看起来并不是很难,但是题目的内容还是第一次见到,这里记录一下,同时也分享给大家,欢迎批评指正。

题目描述

  题目的原文描述是这样的:

Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.

  这个题目的大致意思如下:给出一个二叉树,我们需要计算整个二叉树”直径“的长度。二叉树”直径“的长度被定义为:二叉树中任意2个节点路径长度的最大值,这个路径可能经过也可能不会经过根节点

解题思路

  首先明确一点:这个题目中所描述的路径,并没有要求必须是从上到下的。只要是任意2个节点就可以,这个我们来看一下具体的应用例子。
不经过根节点

  对于上面的二叉树,我们可以看到整个二叉树中最长的路径可以表示为[7,4,5,-2],最长的路径并没有经过根节点。

  在上面的情况是不经过根节点的情况,下面举出另外一种情况,经过根节点。
经过根节点的情况

  上面的情况下,最长路径是经过根节点的,最长路径可以表示为[4,2,1,3]或者[5,2,1,3]。

  经过上面的分析我们可以看到整个题目需要考虑的情况,很明显可以看到,这个题目是可以用递归的思想来进行解答的,具体的思路,我们可以总结到:

  1. 对于每个节点来说,每个当前节点下的最大的长度 = 左子树的高度+ 右子树的高度。
  2. 对于每个节点来说,需要比较当前节点的最大长度是否是最大的,如果是最大则需要改变全局的最大值。

  经过上面的思路,我们就可以看到,这个题目实际上就是求二叉树高度的一个变种而已。

程序代码

  这里我们主要采用了C语言来写(主要是涉及到指针的操作),下面我贴出整个程序的源代码,供大家参考。

 struct TreeNode {
     int val;
     struct TreeNode *left;
     struct TreeNode *right;
};
int test(struct TreeNode * root, int * max){
    if(root == NULL)
        return 0;
    else{
        int deepth = 0; // 记录当前节点下的长度
        int left_deepth = test(root->left, max); //求左子树高度
        int right_deepth = test(root->right, max); // 求右子树高度
        deepth += left_deepth; 
        deepth += right_deepth; // 求出当前节点下的最大长度
        if(deepth > *max) // 与最大长度进行比较
            *max = deepth;
        return (left_deepth > right_deepth ? left_deepth : right_deepth) + 1; // 返回当前节点的高度
    }
}
int diameterOfBinaryTree(struct TreeNode* root) {
    int max = 0;
    test(root, &max);
    return max;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值