Leetcode.543 二叉树的直径

递归

最大直径=最大左节点数+最大右节点数-1(要-1是因为求的直径是指这段路的边,边数=节点数-1 )

要注意一个点就是记录最大直径的那个变量n要定义在函数外面!!!

在这里插入图片描述
以这张图为例:
从根节点出发,分别从它的左节点和右节点向下,比方说左节点一路向下走到叶子节点4,此时4没有孩子,将4看成是本次函数的root:

int deft(TreeNode* root){
        if(root==NULL){
            return 0;               //a
        }
        int l=deft(root->left);     //b
        int r=deft(root->right);    //c
        n=max(l+r,n);   
        return max(l,r)+1;          //d
    }

a:4!=null,所以还没有返回
b:此时执行dept(4->left)时,由于4->left=null,则return 0,b结束
c:此时执行dept(4->right)时,由于4->right=null,也return 0,c结束
d:return max(0,0)+1即return 1

此时以4为root的函数已完整执行完,即dept(2->left)已执行完毕,接下来执行dept(2->right)同上
所以可以理解成找到直接走到最深的地方再开始往回一步一步计数,其中dept函数return的值代表当前root的全部孩子都已经被遍历完成了,返回的这个值记录着从当前root出发的最长路径

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int n=0;    //不能定义在函数内!!!
    int diameterOfBinaryTree(TreeNode* root) {
        deft(root);
        return n;
    }
    int deft(TreeNode* root){
        if(root==NULL){
            return 0; 
        }
        int l=deft(root->left);
        int r=deft(root->right);
        n=max(l+r,n);      //n是记录最大直径的,最大直径是最大左边节点数+最大右边节点数-1,所以是比较l+r
        return max(l,r)+1;   //走到这里意味着有一个节点它的左右孩子都遍历结束了,此时+1代表的是它本身;记录着从当前root出发的最长路径
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值