四、二叉树-上(Binary tree)

2023-09-22 10:31:36

一、算法核心思想

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分!
快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历。
在这里插入图片描述

二、算法模型

(一)回溯

1.104.二叉树的最大深度

(1)思路

如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为max(l,r)+1,而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1)时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。

(2)代码
/**
 * 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 maxDepth(TreeNode* root) {
        if (root == nullptr) return 0;
        return max(maxDepth(root -> left),maxDepth(root -> right)) + 1;
    }
};
(3)复杂度分析
  • 时间复杂度:O(n),其中 n 为二叉树节点的个数。每个节点在递归中只被遍历一次。
  • 空间复杂度:O(height),height表示二叉树的高度,递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

2.144.二叉树的前序遍历

(1)思路
(2)代码
/**
 * 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:
    void traversal(TreeNode* cur,vector <int> &vec) {
      if (cur == NULL) return;
      vec.push_back(cur -> val);
      traversal(cur -> left,vec);
      traversal(cur -> right,vec);
    }
    vector<int> preorderTraversal(TreeNode* root) {
      vector <int> result;
      traversal(root,result);
      return result;
    }
};
(3)复杂度分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

3.543.二叉树的直径

(1)思路
(2)代码
/**
 * 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 res = 0;
    int diameterOfBinaryTree(TreeNode* root) {
         maxDepth(root);
        return res;
    }
    int maxDepth(TreeNode* root) {
        if (root == nullptr)
            return 0;
        int leftMax = maxDepth(root -> left);
        int rightMax = maxDepth(root -> right);

        int myDia = leftMax + rightMax;
        res = max(res,myDia);
        return 1 + max(leftMax,rightMax);
    }
};
(3)复杂度分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
更多推荐

设计模式之代理模式的懂静态代理和动态代理

目录1概述1.1如何实现?1.2优点1.3缺点1.4适用场景2静态代理实现3JDK动态代理实现4CGlib动态代理实现5总结1概述代理模式(ProxyPattern)是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个角色:代理角色和真实角色。代理类负责代理真实类,为

mybatis简介&idea导入mybatis

mybatis简介Mybatis是Apache的一个Java开源项目,是一个支持动态Sql语句的持久层框架。Mybatis可以将Sql语句配置在XML文件中,避免将Sql语句硬编码在Java类中。与JDBC相比:1)Mybatis通过参数映射方式,可以将参数灵活的配置在SQL语句中的配置文件中,避免在Java类中配置参

设计模式:解释器模式

目录组件代码示例优缺点总结解释器模式(InterpreterPattern)是一种行为型设计模式,它定义了一种语言的文法,并且定义了该语言中各个元素的解释器。通过使用解释器,可以解析和执行特定的语言表达式。解释器模式的核心思想是将一个语言的文法表示为一个类的层次结构,并使用该类的实例来表示语言中的各个元素。每个元素都有

优化代码,提升代码性能

文章目录一、方法1.尽量指定类、方法的final修饰符二、变量1.循环内不要不断创建对象引用2.基本类型转换成字符串3.如果变量的初值会被覆盖,就没有必要给变量赋初值4.尽量使用基本数据类型,避免不必要的装箱、拆箱和空指针判断三、常量1.将常量声明为staticfinal,并以大写命名2.禁止使用JSON转化对象四、对

nvme prp模型代码处理流程分析

以下函数是prp相关的源码。/**prp模型,除了第一个dmaaddr不是page_size对齐的其余的dmaaddr都要求是page_size对齐的*/staticblk_status_tnvme_pci_setup_prps(structnvme_dev*dev,structrequest*req,structnv

Google Data Fusion构建数据ETL任务

Google云平台提供了一个DataFusion的产品,是基于开源的CDAP做的一个图形化的编辑工具,可以很方便的来完成数据处理的任务,而无需编写代码。假设我们现在要构建一个ETL的任务,从Kafka中消费一些数据,经过处理之后把数据存放到Bigquery中。首先我们要准备一些测试数据发送到Kafka。这里我是在GKE

2023年腾讯云轻量应用服务器16核32G28M配置测评

腾讯云轻量应用服务器16核32G28M配置优惠价3468元15个月(支持免费续3个月/送同配置3个月),轻量应用服务器具有100%CPU性能,系统盘为380GBSSD盘,28M带宽下载速度3584KB/秒,月流量6000GB,折合每天200GB流量,超出月流量包的流量按照0.8元每GB的价格支付流量费,地域节点可选广州

【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五)

restful是web编程里重要的概念–一种接口规范也是一种接口设计风格设计接口:要考虑:数据返回、接收数据的方式、url、方法统一风格rest–表现层状态转移web–每一类数据–资源资源通过http的动作来实现状态转移GET、PUT、POST、DELETEpath组成:/{version}/{resources}/{

分布式运用之企业级日志ELFK+logstash的过滤模块

一、ELFK集群部署(Filebeat+ELK)在搭建ELK的基础上安装Filebeat服务,Filebeat服务可以布置在以下任意一台主机,本次实验将布置在apache服务器的节点上步骤一:安装Filebeat(在apache节点操作)#上传软件包filebeat-6.7.2-linux-x86_64.tar.gz到

面向对象进阶

文章目录面向对象进阶一.static1.静态变量2.静态方法3.static的注意事项二.继承1.概述2.特点3.子类可以继承父类中的内容4.继承中成员变量的访问特点5.继承中成员方法的访问特点6.继承中构造方法的访问特点7.this和super使用总结三.多态1.认识多态2.多态中调用成员的特点3.多态的优势和弊端四

Bigemap如何添加谷歌历史影像

工具Bigemapgisoffice地图软件BIGEMAPGISOffice-全能版BigemapAPP_卫星地图APP_高清卫星地图APP很多粉丝私信都在问怎么才可以看到谷歌的历史影像,其实这个图源目前是没有对大陆网络ip进行开放,所以如果需要查看,也是需要看你当前的网络是否允许查看,如果可以查看的话,就可以通过bi

热文推荐