当前位置: 首页 > article >正文

LeetCode 热题 100_二叉树的直径(40_543_简单_C++)(二叉树;递归)

LeetCode 热题 100_二叉树的直径(40_543)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(递归):
      • 代码实现
        • 代码实现(思路一(递归)):
        • 以思路一为例进行调试

题目描述:

给你一棵二叉树的根节点,返回该树的 直径

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

输入输出样例:

示例 1:
在这里插入图片描述

输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:
输入:root = [1,2]
输出:1

提示:
树中节点数目在范围 [1, 104] 内
-100 <= Node.val <= 100

题解:

解题思路:

思路一(递归):

1、我们可以采用和计算二叉树深度同样的思想,计算二叉树的深度是挑选左右子树中深度的最大值,而二叉树的直径是左子树的最大深度深度+右子树的最大深度。
2、复杂度分析:
① 时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
② 空间复杂度:O(h),其中 h 为二叉树的高度(递归需要额外的栈空间)。
本题的力扣官方题解链接(非常不错)

代码实现

代码实现(思路一(递归)):
//二叉树的直径
int diameterOfBinaryTree(TreeNode* root) {
    depth(root);
    return ans;
}

int depth(TreeNode *root){
    if(root==nullptr) return 0;
    
    //left:左子树的高度(高度指从叶结点开始测量)
    int left=depth(root->left);
    //right:右子树的高度
    int right=depth(root->right);
    
    //更新树的最大直径
    ans=max((left+right),ans);
 	// 返回当前节点的深度
    return max(left,right)+1;
}
以思路一为例进行调试
#include<iostream>
#include<vector>
#include<queue>
using namespace std;

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 Soluton
{
    int ans=0;
    //注意递归返回的是深度,所以我们要分成两个函数
    int depth(TreeNode *root){
        if(root==nullptr) return 0;
        //left:左孩子子树的高度(高度指从叶结点开始测量)
        int left=depth(root->left);
        //right:右孩子子树的高度
        int right=depth(root->right);
        //求当前两节点间的最大长度
        ans=max((left+right),ans);
        return max(left,right)+1;
    }

public:
    //二叉树的直径
    int diameterOfBinaryTree(TreeNode* root) {
        depth(root);
        return ans;
    }

    //通过数组创建二叉树(数组元素为-1代表nullptr)
    TreeNode *creatTree(vector<int> nums){
        if(nums.empty()) return nullptr;
        TreeNode *root=new TreeNode(nums[0]);
        queue<TreeNode *> q;
        q.push(root);
        int i=1;
        while (i<nums.size())
        {
            TreeNode *node=q.front();
            q.pop();
            if(i<nums.size()&&nums[i]!=-1){
                node->left=new TreeNode(nums[i]);
                q.push(node->left);
            }
            ++i;
            if(i<nums.size()&&nums[i]!=-1){
                node->right=new TreeNode(nums[i]);
                q.push(node->right);
            }
            ++i;
        }
        
        return root;
    }

    //中序遍历输出二叉树(用于调试二叉树创建是否正确)
    void inorder(TreeNode *root){
        if(root==nullptr) return ;
        inorder(root->left);
        cout<<root->val<<" ";
        inorder(root->right);
    } 
};

int main(){
    vector<int> nums={1,2,3,4,5};
    Soluton s;
    //创建二叉树
    TreeNode *root=s.creatTree(nums);
    //调试二叉树是否创建正确
    //s.inorder(root); 
    cout<<"二叉树的直径:"<<s.diameterOfBinaryTree(root);
    return 0;
}

LeetCode 热题 100_二叉树的直径(40_543)原题链接
欢迎大家和我沟通交流(✿◠‿◠)


http://www.kler.cn/a/462965.html

相关文章:

  • 详细的一条SQL语句的执行流程
  • overleaf写学术论文常用语法+注意事项+审阅修订
  • kubelet状态错误报错
  • driftingblues2
  • STLG_01_05_程序设计C语言 - 数据类型概念解析
  • 机器学习之逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告
  • pip安装paddle失败
  • 【AIGC篇】“智” 造元宇宙新境:AIGC 于虚拟现实的奇幻征途
  • 亚马逊国际站商品爬虫:Python实战指南
  • 【操作系统进程与线程管理:从PCB到多线程并发编程】
  • 基本语法与数据结构:全面掌握 Java 的基础
  • STM32使用UART发送字符串与printf输出重定向
  • 自动驾驶---Tesla FSD Version 13
  • Java排序算法全解析
  • memcached的基本使用
  • arcgis模版空库怎么用(一)
  • 基于Java+SQL Server实现的(GUI)会展中心管理系统
  • Wndows bat将一个目录下所有子文件夹的路径导出到txt文本
  • Windows 安装 MySQL8(在已有MySQL 5.7 的情况下)
  • 【SQL Server】教材数据库(3)
  • 【Domain Generalization(2)】领域泛化在文生图领域的工作之——PromptStyler(ICCV23)
  • 爬虫基础之爬取表情包GIF
  • Pyqt+Opencv的练习
  • 【嵌入式硬件】嵌入式显示屏接口
  • CTFshow-pwn刷题
  • Mongodb日志报错too many open files,导致mongod进程down