【算法刷题day14】二叉树理论基础、递归遍历、迭代遍历、统一迭代

二叉树理论基础

题目分类

在这里插入图片描述

二叉树的种类

无数值两种:满二叉树完全二叉树
在这里插入图片描述
有数值:二叉搜索树
1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2.若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3.它的左、右子树也分别为二叉排序树
有数值:平衡二叉搜索树 AVL(Adelson-Velsky and Landis)它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是棵平衡二叉树。
在这里插入图片描述

二叉树的存储方式

链式存储顺序存储
链式存储:通过指针把分布在各个地址的节点串联一起。
顺序存储:如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。
在这里插入图片描述
在这里插入图片描述

二叉树的遍历方式

遍历方式:深度优先遍历广度优先遍历
深度优先遍历:先往深走,遇到叶子节点再往回走。前中后序遍历的逻辑其实都是可以借助栈使用递归的方式来实现的。
1.前序遍历(递归法,迭代法)
2.中序遍历(递归法,迭代法)
3.后序遍历(递归法,迭代法)
广度优先遍历:一层一层的去遍历。广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。
1.层次遍历(迭代法)
在这里插入图片描述

二叉树的定义

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

二叉树的递归遍历

递归三要素

1.确定递归函数的参数和返回值
2.确定终止条件
3.确定单层递归的逻辑

144.二叉树的前序遍历(opens new window)
145.二叉树的后序遍历(opens new window)
94.二叉树的中序遍历

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> order;
        traversal(root, order);
        return order;
    }
    void traversal(TreeNode* root, vector<int>& order){
        if(root == nullptr)return ;
        order.push_back(root->val);
        traversal(root -> left,order);
        traversal(root -> right,order);
    }
};
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector <int> res;
        traversal(root,res);
        return res;
    }
    void traversal(TreeNode* root, vector<int> & res){
        if(root == nullptr) return ;
        traversal(root -> left, res);
        traversal(root -> right, res);
        res.push_back(root -> val);
    }
};
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        traversal(res, root);
        return res;
    }
    void traversal(vector<int> & res, TreeNode* root){
        if(root == nullptr)return ;
        traversal(res, root -> left);
        res.push_back(root -> val);
        traversal(res, root -> right);
    }
};

二叉树的迭代遍历

144.二叉树的前序遍历(opens new window)
145.二叉树的后序遍历(opens new window)
94.二叉树的中序遍历

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> res;
        if(root == nullptr) return res;
        st.push(root);
        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();
            res.push_back(node -> val);
            if(node -> right)st.push(node -> right);
            if(node -> left)st.push(node -> left);
        }
        return res;
    }
};
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while(cur!= nullptr || !st.empty()){
            if(cur != nullptr){
                st.push(cur);
                cur = cur -> left;
            }else{
                cur = st.top();
                st.pop();
                res.push_back(cur -> val);
                cur = cur -> right;
            }
        }
        return res;
    }
};
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> st;
        if(root == nullptr) return res;
        st.push(root);
        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();
            res.push_back(node -> val);
            if(node -> left) st.push(node -> left);
            if(node -> right) st.push(node -> right);
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

统一迭代法

懒得看

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python快速入门系列-6(Python高级特性)

第六章: Python高级特性 6.1 列表推导式与生成器6.1.1 列表推导式6.1.2 生成器6.1.2.1 生成器表达式6.1.2.2 生成器函数6.2 装饰器与迭代器6.2.1 装饰器6.2.2 迭代器6.3 异常处理与错误调试6.3.1 异常处理6.3.1.1 try-except语句6.3.1.2 try-except-else语句6.3.2 错误调试6.3…

恶劣条件下GNSS定位的鲁棒统计

全球导航卫星系统&#xff08;GNSS&#xff09;作为定位信息的主要来源&#xff0c;在智慧工厂、智慧能源、智慧交通的未来应用中发挥着重要作用。此外&#xff0c;GNSS为电网或股市等关键应用提供定时同步功能。然而&#xff0c;GNSS的性能很容易因自然现象和信号反射而降低。…

AI技术创业有哪些机会?

AI技术创业有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着AI技术的快速发展和应用领域的不断拓展&#xff0c;未来AI技术方面会有哪些创业机会呢&#xff1f; 创什么业打工才是…

Fluentd介绍

1.什么是Fluentd Fluentd是一个开源的日志收集和分发系统&#xff0c;它能够从多种数据源采集日志信息&#xff0c;并对日志进行过滤、加工处理后发送到不同的存储和处理系统。 以下是关于Fluentd的一些关键信息&#xff1a; 基本概念&#xff1a;Fluentd被设计为一个高性能…

RPA机器人如何支持滑块验证码?泽众RPA如何轻松解决?

为了提高软件的安全性&#xff0c;很多系统&#xff0c;包括web系统和手机上的应用&#xff0c;越来越多的使用验证码来提升系统的安全性&#xff0c;防止非法访问&#xff0c;特别是防止机器人的访问。 如上图所示&#xff0c;就是最近比较常用的“滑块验证码”。它要求用户“…

广告业务知识-数据

最近做了些广告业务&#xff0c;梳理下&#xff0c;分广告术语、业务架构、数据架构三篇。以效果广告为例&#xff0c;下面是数据篇&#xff08;图片做了脱敏处理哈&#xff09;&#xff1a; 1.效果广告实体关系 2.广告数据大图 2.1数据模块大图 2.2 详细核心数据大图

ollama本地部署大模型(纯CPU推理)实践

文章目录 说明Ollama和Ollama WebUI简介Ollama模型硬件要求内存要求 Ollama容器部署Ollama容器内模型下载和对话Ollama WebUI部署Ollama WebUI下载模型和对话轻量模型推荐机器硬件信息概览qwen:0.5b推理体验gemma:7b推理体验 说明 本文旨在分享在linux(centos8)平台使用docker…

ry - vue项目 docker部署

一、创建网络 1.搭建net-ry局域网 用于部署若依项目 docker network create net-ry --subnet172.68.0.0/16 --gateway172.68.0.1查看一下。 2、关闭防火墙 1&#xff09;、关闭防火墙 systemctl stop firewalld如果不关闭防火墙&#xff0c;容器内部的mysql、redis等服务…

“一起华裔洗钱案震惊全球”,涉案6.1万枚比特币!英国欲将其“充公”?中方:赃款为潜逃资金,有权追回!

最近&#xff0c;英国警方公布了一桩国际洗钱大案&#xff0c;查获超过6.1万枚比特币&#xff0c;这些资金由华裔英国女子Jian Wen&#xff08;温简&#xff09;涉嫌协助被中国通缉的诈骗集团首脑Zhimin Qian&#xff08;钱志敏&#xff09;而获得&#xff0c;据悉她将于5月10日…

正大国际:安全合规的外盘期货途径

“外盘期货”一词是指在中国大陆以外建立的期货交易市场。交易所基于国内期货和外盘期货的全球定价、价格权威、巨大的外部交易量、成熟的交易市场和交易机制、强大的流动性、巨大的市场容量、在中国大陆没有控制和强劲的趋势。然而&#xff0c;许多人被引诱进入非法甚至非法平…

函数调用实现小米汽车智能语音助手

上周小米汽车发布&#xff0c;其中有一个特色功能就是智能语音&#xff0c;小爱同学整合了语音大模型&#xff0c;实现智能座舱体验。 雷老板的PPT也演示了&#xff0c;一些口语化的对话就能触发各种指令&#xff0c;无论是开空调、播放音乐&#xff0c;还是找手机、识别前方汽…

Python学习:面相对象

面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…

测试打工仔的5年职场感悟:软件测试还有未来吗?

工作过程 目前坐标广州&#xff0c;从毕业至今五年一直在当前的公司工作着&#xff0c;从部门最开始的十几人团队发展到现在的将近两百号人&#xff0c;几年了没换工作不是因为习惯舒适区&#xff0c;相反这一路过来都是不断的突破&#xff0c;因为团队在快速壮大&#xff0c;…

RK3568驱动指南|第十四篇 单总线-第158章DS18B20编写字符设备驱动框架

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

南达股份携手数环通iPaaS,打造统一的接口集成管理平台

01 客户背景 南达股份成立于2004年&#xff0c;专注农业种植、畜牧养殖、精深加工为一体的生态循环产业发展。以乳制品、特色林果产品和特色食品为主营业务&#xff1b;优选源自帕米尔高原纯净区域的生态物产&#xff0c;精心打造一、二、三产业融合的大健康产业。 南达股份是农…

1区、TOP、CCF推荐,最快16天录用!4月刊源表已更新!

毕业推荐 SSCI • 社科类&#xff0c;分区稳步上升&#xff08;最快13天录用&#xff09; IEEE&#xff1a; • 计算机类&#xff0c;1区(TOP)&#xff0c;CCF推荐 SCIE • 计算机工程类&#xff0c;CCF推荐&#xff08;最快16天录用&#xff09; 2024年4月 SCI/SSCI/EI…

Vue基础配置、组件通信、自定义指令

基础配置 Vue框架已经集成了webpack配置 小注意点 vbase 快速生成vue模板 组件名必须是多词格式(驼峰模式) 具体三种写法: ①小驼峰:abcDef.vue ②大驼峰&#xff1a;AbcDef.vue ③中横线&#xff1a;abc-def.vue 假如文件名不符合多次格式的补救办法&#xff1a; 导出重命名…

回溯算法|90.子集II

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex, vector<bool>& used) {result.push_back(path);for (int i startIndex; i < nums.si…

clickhouse sql使用2

1、多条件选择 multiIf(cond_1, then_1, cond_2, then_2, …, else) select multiIf(true,0,1) 当第一条件不成立看第二条件判断 第一个参数条件参数&#xff0c;第二参数条件成立时走 2、clickhouse 在计算时候长出现NaN和Infinity异常处理 isNaN()和isInfinite()处理

某金融单位微软AD国产化替代方案分享与收获

某金融单位是宁盾长期服务的老客户&#xff0c;一直使用宁盾的2FA双因子认证&#xff08;OTP动态口令&#xff09;及网络准入服务。近日&#xff0c;该公司 IT 经理找到宁盾咨询关于微软 AD&#xff08;活动目录&#xff09;替代事宜。在与客户当面交流后&#xff0c;宁盾将客户…