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

代码随想录二刷——二叉树day19

文章目录

  • 前言
    • 二叉树知识点
    • 二叉树的存储方式
  • 一、654. 最大二叉树
  • 二、617. 合并二叉树
  • 三、700. 二叉搜索树中的搜索
  • 四、98. 验证二叉搜索树
  • 总结


前言

一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油!
二刷决定精刷了,于是参加了卡子哥的刷题班,训练营为期60天,我一定能坚持下去,迎来两个月后的脱变的,加油!
推荐一手卡子哥的刷题网站,感谢卡子哥。代码随想录

二叉树知识点

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分。

二叉树有两种主要的形式:满二叉树和完全二叉树。

满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。

二叉树的存储方式

二叉树可以链式存储,也可以顺序存储。

那么链式存储方式就用指针, 顺序存储的方式就是用数组。

顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。

二叉树有两种主要的形式:满二叉树和完全二叉树。

叉树主要有两种遍历方式:

深度优先遍历:先往深走,遇到叶子节点再往回走。
广度优先遍历:一层一层的去遍历。
深度优先遍历
前序遍历(递归法,迭代法)中左右
中序遍历(递归法,迭代法)左中右
后序遍历(递归法,迭代法)左右中
广度优先遍历
层次遍历(迭代法)

前中后序遍历的逻辑其实都是可以借助栈使用递归的方式来实现的。

而广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。

一、654. 最大二叉树

654. 最大二叉树
Note:递归

/*** 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:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {TreeNode* node = new TreeNode(0);if (nums.size() == 1) {node->val = nums[0];return node;}int maxValue = 0;int maxValueIndex = 0;for (int i = 0; i < nums.size(); i++) {if (nums[i] > maxValue) {maxValue = nums[i];maxValueIndex = i;}}node->val = maxValue;if (maxValueIndex > 0) {vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);node->left = constructMaximumBinaryTree(newVec);}if (maxValueIndex < (nums.size() - 1)) {vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());node->right = constructMaximumBinaryTree(newVec);}return node;}
};

二、617. 合并二叉树

617. 合并二叉树
Note:递归合并

/*** 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:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if (root1 == NULL) return root2;if (root2 == NULL) return root1;root1->val += root2->val;root1->left = mergeTrees(root1->left, root2->left);root1->right = mergeTrees(root1->right, root2->right);return root1;}
};

三、700. 二叉搜索树中的搜索

700. 二叉搜索树中的搜索
Note:递归

/*** 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:TreeNode* searchBST(TreeNode* root, int val) {if (root == NULL || root->val == val) return root;TreeNode* node = NULL;if (root->val > val) node = searchBST(root->left, val);if (root->val < val) node = searchBST(root->right, val);return node;}
};

Note:迭代法

/*** 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:TreeNode* searchBST(TreeNode* root, int val) {while (root != NULL) {if (root->val > val) root = root->left;else if (root->val < val) root = root->right;else return root;}return NULL;}
};

四、98. 验证二叉搜索树

98. 验证二叉搜索树
Note:转成数组判断

/*** 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 {
private:vector<int> vec;void traversal(TreeNode* root) {if (root == NULL) return;traversal(root->left);vec.push_back(root->val);traversal(root->right);}
public:bool isValidBST(TreeNode* root) {vec.clear();traversal(root);for (int i = 1; i < vec.size(); i++) {if (vec[i] <= vec[i - 1]) return false;}return true;}
};

总结

二叉树是一种基础数据结构,在算法面试中都是常客,也是众多数据结构的基石。

相关文章:

  • 点击侧边栏菜单时只切换 <router-view> 中的内容,而不是进行整个页面的路由跳转(动态路由)
  • 替换ubuntu linux kernel内核, 实际操作有效
  • Java学习第十四节之冒泡排序
  • 文件上传漏洞:upload-labs靶场通关
  • Python dict函数
  • 浅谈业务场景中缓存的使用
  • elasticsearch下载及可视化工具下载使用
  • 无人机导航技术,无人机导航理论基础,无人机导航技术应用发展详解
  • 机器学习:卷积介绍及代码实现卷积操作
  • 华为第二批难题五:AI技术提升六面体网格生成自动化问题
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • 炫酷3D按钮
  • λ-矩阵知识点
  • 酷开科技荣获消费者服务平台黑猫投诉“消费者服务之星”称号
  • Swift Combine 级联多个 UI 更新,包括网络请求 从入门到精通十六
  • 【前端学习】-粗谈选择器
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Docker: 容器互访的三种方式
  • Java编程基础24——递归练习
  • JS+CSS实现数字滚动
  • Python学习之路13-记分
  • Selenium实战教程系列(二)---元素定位
  • Vue.js-Day01
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 基于web的全景—— Pannellum小试
  • 经典排序算法及其 Java 实现
  • 聊聊redis的数据结构的应用
  • 一些关于Rust在2019年的思考
  • 怎样选择前端框架
  • 最简单的无缝轮播
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 2017年360最后一道编程题
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 数据结构
  • # 数论-逆元
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1)虚拟机的安装与使用,linux系统安装
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (新)网络工程师考点串讲与真题详解
  • (转)scrum常见工具列表
  • (转)为C# Windows服务添加安装程序
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net framework4与其client profile版本的区别
  • .NET 动态调用WebService + WSE + UsernameToken