代码随想录算法训练营第十四天 |二叉树

news2024/11/24 11:11:57

1.理论基础

  1. 二叉树定义

    Class TreeNode() {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(){};
        TreeNode(int val) {this.val = val;}
        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
    
  2. 二叉树种类
    在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树。
    满二叉树: 只有度为0和度为2的节点;
    完全二叉树:除了最底层可能没填满,其他每层的节点数都是最大值,且最底层的节点都集中在该层的最左边;

  3. 二叉树存储方式
    主要为链表方式和数组方式;
    imgimg

  4. 二叉树的遍历方式
    深度优先遍历:下面的前中后指的是中间节点的遍历位置

    • 前序遍历(中左右)
      递归法:

      class Solution {
          public List<Integer> preorderTraversal(TreeNode root) {
              List<Integer> result = new ArrayList<Integer>();
              preorder(root, result);
              return result;
          }
      
          public void preorder(TreeNode root, List<Integer> result) {
              // 迭代终止条件
              if (root == null) {
                  return;
              }
              // 中左右
              result.add(root.val);
              preorder(root.left, result);
              preorder(root.right, result);
          }
      }
      

      迭代法:

      class Solution {
          public List<Integer> preorderTraversal(TreeNode root) {
              List<Integer> result = new ArrayList<>();
              if (root == null){
                  return result;
              }
              Stack<TreeNode> stack = new Stack<>();
              stack.push(root);
              while (!stack.isEmpty()){
                  TreeNode node = stack.pop();
                  result.add(node.val);
                  if (node.right != null){
                      stack.push(node.right);
                  }
                  if (node.left != null){
                      stack.push(node.left);
                  }
              }
              return result;
          }
      }
      
    • 中序遍历(左中右)
      递归法:

      // 中序遍历·递归·LC94_二叉树的中序遍历
      class Solution {
          public List<Integer> inorderTraversal(TreeNode root) {
              List<Integer> res = new ArrayList<>();
              inorder(root, res);
              return res;
          }
      
          void inorder(TreeNode root, List<Integer> list) {
              if (root == null) {
                  return;
              }
              // 左中右
              inorder(root.left, list);
              list.add(root.val);             
              inorder(root.right, list);
          }
      }
      

      迭代法:

      class Solution {
          public List<Integer> inorderTraversal(TreeNode root) {
              List<Integer> result = new ArrayList<>();
              if (root == null){
                  return result;
              }
              Stack<TreeNode> stack = new Stack<>();
              TreeNode cur = root;
              while (cur != null || !stack.isEmpty()){
                 if (cur != null){
                     stack.push(cur);
                     cur = cur.left;
                 }else{
                     cur = stack.pop();
                     result.add(cur.val);
                     cur = cur.right;
                 }
              }
              return result;
          }
      }
      
    • 后序遍历(左右中 )
      递归法:

      class Solution {
          public List<Integer> postorderTraversal(TreeNode root) {
              List<Integer> res = new ArrayList<>();
              postorder(root, res);
              return res;
          }
      
          void postorder(TreeNode root, List<Integer> list) {
              if (root == null) {
                  return;
              }
              // 左右中
              postorder(root.left, list);
              postorder(root.right, list);
              list.add(root.val);             
          }
      }
      

      迭代法:

      class Solution {
          public List<Integer> postorderTraversal(TreeNode root) {
              List<Integer> result = new ArrayList<>();
              if (root == null){
                  return result;
              }
              Stack<TreeNode> stack = new Stack<>();
              stack.push(root);
              while (!stack.isEmpty()){
                  TreeNode node = stack.pop();
                  result.add(node.val);
                  if (node.left != null){
                      stack.push(node.left);
                  }
                  if (node.right != null){
                      stack.push(node.right);
                  }
              }
              Collections.reverse(result);
              return result;
          }
      }
      

    广度优先遍历

    • 层次遍历

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql事务隔离级别是怎么实现的?

文章目录事务隔离级别解析常用命令查看事务隔离级别设置修改隔离级别隔离级别演示Mysql事务操作MVCC实现原理undo log版本链ReadView练习一下案例1案例2问答环节1、Mysql 可重复读到底有没有解决幻读&#xff1f;事务隔离级别 Mysql的事务隔离级别是由Mysql的各种锁以及MVCC机…

基于工业网关的储罐在线监测系统解决方案

储罐可以用来存放油、气、化学原料、工业原料等物资&#xff0c;是石油、化工、粮油、国防、冶金等行业必不可少的基础设施。随着储罐行业和相关行业的发展&#xff0c;越来越多企业开始运用储罐并产生储罐在线监测需求&#xff0c;需要实时了解储罐内的状态&#xff0c;保证重…

最强ADI SHARC系列DSP:ADSP-SC589的开发入门详解

作者的话 ADI的SHARC系列DSP&#xff0c;现阶段最强的型号是SC589&#xff0c;那么我就以SC589为例&#xff0c;写一点资料&#xff0c;让新手能够比较便捷的熟悉开发环境&#xff0c;软硬件&#xff0c;顺利的进入开发。 文档解决的是入门的问题&#xff0c;所以不会深入去写…

SpringCloud Alibaba框架都有啥啊

前言 文章目录前言1.集成Nacos实现服务的自动注册与发现2. Feign负载均衡注&#xff1a;OpenFeign和Feign的区别&#xff1a;3.使用Sentinel实现了接口的限流4.Feign整合Sentinel实现容错5.API网关6.Sleuth整合ZipKin实现链路追踪7.消息队列MQspring cloud是一个基于springboot…

做软件测试如何突破月薪20K?

IT行业从事技术岗位&#xff0c;尤其对于测试来说&#xff0c;月薪20K&#xff0c;即便在北上广深这类一线城市薪水也不算低了&#xff0c;可以说对于大部分测试岗位从业者来说&#xff0c;20K都是一个坎儿。 那么&#xff0c;问题来了&#xff0c;做软件测试如何可以达到月薪…

贪心,动态规划的区别

题目&#xff08;力扣53&#xff09;&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组 是数组中的一个连续部分。 示例&#xff1a; 输入&#xff1a;n…

System V 消息队列(一)—— 消息队列相关接口函数(msgget / msgctl)

SystemV方案是在OS内核层面专门为进程间通信设计的一个方案&#xff0c;然后通过系统调用&#xff08;system call&#xff09;给用户提供通信接口。SystemV方案包含三种&#xff1a;共享内存、消息队列、信号量。 和System V 共享内存一样&#xff0c;OS为了管理这些消息队列…

【机器学习实战】对加州住房价格数据集进行数据探索(读书笔记)

1. 数据集描述及获取 数据集下载地址&#xff1a;housing.csv数据集的结构&#xff1a; 其中数据集有10个属性&#xff0c;分别为经度、纬度、housing_median_age、房间总数、卧室总数、人口数、家庭数、收入中位数、房价中位数、ocean_proximity。 2. 对数据集进行探索 2.…

web系统开发中关于企业里各种系统分类

关于企业里各种系统 OA 办公自动化系统 Office Automation &#xff08;将现代化办公和计算机网络功能结合起来的新型办公方式&#xff09; 功能&#xff1a;工作流、知识管理 功能模块&#xff1a;日报、考勤、事项审批等CRM 客户关系管理 Customer Relationship Management&…

C++日期和时间编程小结

C11 的日期和时间编程内容在 C Primer(第五版)这本书并没有介绍&#xff0c;目前网上的文章又大多质量堪忧或者不成系统&#xff0c;故写下这篇文章用作自己的技术沉淀和技术分享&#xff0c;大部分内容来自网上资料&#xff0c;文末也给出了参考链接。 日期和时间库是每个编程…

百度前端二面常考面试题

HTTP分层 第一层&#xff1a;物理层&#xff0c;TCP/IP 里无对应&#xff1b;第二层&#xff1a;数据链路层&#xff0c;对应 TCP/IP 的链接层&#xff1b;第三层&#xff1a;网络层&#xff0c;对应 TCP/IP 的网际层&#xff1b;第四层&#xff1a;传输层&#xff0c;对应 TCP…

编写递归函数,求斐波那契数列第n项

要求&#xff1a;编写递归函数int f(int n)&#xff0c;计算如下公式&#xff1a; 定义main函数输入n&#xff0c;调用f函数进行计算&#xff0c;在main函数中输出计算结果。 【样例输入】 10 【样例输出】 89 主函数&#xff1a; #include<stdio.h> int main() { in…

基于ssm的社区疫情返乡管控系统设计实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

C# 学习之路(类型、存储和变量)

C# 学习之路&#xff08;类型、存储和变量&#xff09; C# 是一组类型声明 如果泛泛的描述 C 和 C 程序源代码的特征&#xff0c;可以说 C 程序是一组函数和数据类型&#xff0c;C 是一组函数和类&#xff0c;而 C# 程序是一组类型的声明。 命名空间是一种将相关的类型声明分组…

mongodb 5.0.14 副本集 安装 单机版 记录

1、下载tgz 连接地址&#xff1a;mongodb 5.0.14下载 2、创建用户 useradd mongouserpasswd mongouser 3、解压tgz wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.14.tgz tar -zxvf mongodb-linux-x86_64-rhel70-5.0.14.tgz 4、拆分3个独立的mo…

编程团体赛

目录 1047:编程团体赛 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路: 代码: 时间复杂度: 总结: 题目链接: 1047:编程团体赛 编程团体赛的规则为&#xff1a;每个参赛队由若干队员组成&#xff1b;所有队员独立比赛&a…

Protocol buffe vs Json 为什么还会大量使用Json?

JSON&#xff1a;的最大优点就是可读性好&#xff0c;但是体积大。 Protocol Buffers&#xff1a;最大的特点就是体积小&#xff0c;传输需要带宽小&#xff0c;速度快。但是可读性较差 尽管JSON和Protobuf消息可以互换使用&#xff0c;但这些技术的设计目标不同。JSON代表Ja…

【元胞自动机】格子波尔兹曼模型及其应用研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

我去!Python 不愧是脚本之王,这 23 种命令行用法你全部 get 了吗?

1. 快速打印函数的调用栈 在阅读源码的时候&#xff0c;有时候我们想要看整个程序的调用栈是怎样的&#xff1f; 比较常规的做法是使用全局搜索函数&#xff0c;一层一层往上走&#xff0c;效率非常之低。 而我习惯了使用 pdb 对代码进行调试&#xff0c;在使用pdb时&#x…

vscode环境中配置git

1. 建立project空目录用于存放electron基本环境这个环境中得文件不能加入git项目中否则每次更新文件太大github不支持大于100M得文件上传 2. 使用vscode打开project目录 3.打开终端运行npm install electron 运行完成后会生成electron相关得两个json文件和一个文件夹 4.新建一个…