Leetcode题解精讲之二叉树的基本理论(分类、四种遍历方式、存储方式)

news2024/9/20 20:20:14

目录

  • 0 专栏介绍
  • 1 二叉树的基本概念
  • 2 二叉树的分类
  • 3 二叉树的遍历
    • 3.1 前序遍历
      • 3.1.1 递归实现
      • 3.1.2 迭代实现
    • 3.2 中序遍历
      • 3.2.1 递归实现
      • 3.2.2 迭代实现
    • 3.3 后序遍历
      • 3.3.1 递归实现
      • 3.3.2 迭代实现
    • 3.4 层序遍历
      • 3.4.1 递归实现
      • 3.4.2 迭代实现
  • 4 二叉树存储模式
  • 5 其他技巧

0 专栏介绍


1 二叉树的基本概念

二叉树是计算机科学中一种重要的数据结构,二叉树可以为空,或者由根节点及其左右子树组成,每个节点最多有两个子节点,分别称为左子节点右子节点。二叉树可以用于实现各种算法和数据结构,例如二叉搜索树、堆、表达式树等。二叉树的特性使得它在计算机科学中具有广泛的应用,包括在数据库、编译器、图形图像处理等领域。

二叉树的链式定义为

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

2 二叉树的分类

常见的二叉树有:

  • 满二叉树(Full Binary Tree):每个节点要么没有子节点,要么有两个子节点,且所有叶节点位于同一层
    在这里插入图片描述

  • 完全二叉树(Complete Binary Tree):除了最后一层外,每一层的节点都被填满,最后一层的节点尽可能靠左排列

在这里插入图片描述

  • 平衡二叉树(Balanced Binary Tree):任何节点的两棵子树的高度差不超过 1

在这里插入图片描述

  • 排序二叉树(Binary Search Tree):也称为二叉搜索树,左子树上所有节点的键值小于根节点的键值,右子树上所有节点的键值大于根节点的键值

在这里插入图片描述

  • AVL树(AVL Tree):平衡的二叉搜索树,确保任何节点的左右子树高度差不超过 1

3 二叉树的遍历

二叉树的遍历方式指的是中间节点的遍历顺序

在这里插入图片描述
递归遍历模板

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> traversal(TreeNode* root) {
    vector<int> result;
    stack<TreeNode*> st;
    if (root != NULL)
    	st.push(root);
    while (!st.empty()) {
        TreeNode* node = st.top();
        if (node != NULL) {
            st.pop();
            /* 定义遍历顺序
            if (node->right)
            	st.push(node->right); 
            st.push(node);        
            st.push(NULL); 
            if (node->left)
            	st.push(node->left);
            */
        } else {
            st.pop();     
            node = st.top();    
            st.pop();
            result.push_back(node->val); 
        }
    }
    return result;
}

3.1 前序遍历

遍历顺序为根节点->左子树->右子树

3.1.1 递归实现

void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == NULL) return;
    vec.push_back(cur->val);    // 中
    traversal(cur->left, vec);  // 左
    traversal(cur->right, vec); // 右
}

3.1.2 迭代实现

vector<int> traversal(TreeNode* root) {
    vector<int> result;
    stack<TreeNode*> st;
    if (root != NULL) st.push(root);
    while (!st.empty()) {
        TreeNode* node = st.top();
        if (node != NULL) {
            st.pop();
            if (node->right)				// 右
            	st.push(node->right);  
            if (node->left)					// 左
            	st.push(node->left);    
            st.push(node);                  // 中
            st.push(NULL);
        } else {
            st.pop();
            node = st.top();
            st.pop();
            result.push_back(node->val);
        }
    }
    return result;
}

3.2 中序遍历

3.2.1 递归实现

void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == NULL) return;
    traversal(cur->left, vec);  // 左
    vec.push_back(cur->val);    // 中
    traversal(cur->right, vec); // 右
}

3.2.2 迭代实现

vector<int> traversal(TreeNode* root) {
    vector<int> result;
    stack<TreeNode*> st;
    if (root != NULL)
    	st.push(root);
    while (!st.empty()) {
        TreeNode* node = st.top();
        if (node != NULL) {
            st.pop();
            if (node->right)			// 右
            	st.push(node->right); 
            st.push(node);        	    // 中
            st.push(NULL); 
            if (node->left)				// 左
            	st.push(node->left);
        } else {
            st.pop();     
            node = st.top();    
            st.pop();
            result.push_back(node->val); 
        }
    }
    return result;
}

3.3 后序遍历

3.3.1 递归实现

void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == NULL) return;
    traversal(cur->left, vec);  // 左
    traversal(cur->right, vec); // 右
    vec.push_back(cur->val);    // 中
}

3.3.2 迭代实现

vector<int> traversal(TreeNode* root) {
    vector<int> result;
    stack<TreeNode*> st;
    if (root != NULL) st.push(root);
    while (!st.empty()) {
        TreeNode* node = st.top();
        if (node != NULL) {
            st.pop();
            st.push(node);              // 中
            st.push(NULL);
            if (node->right)			// 右
            	st.push(node->right);  
            if (node->left)				// 左
            	st.push(node->left);    
        } else {
            st.pop();
            node = st.top();
            st.pop();
            result.push_back(node->val);
        }
    }
    return result;
}

3.4 层序遍历

3.4.1 递归实现

void order(TreeNode* cur, vector<vector<int>>& result, int depth)
{
    if (cur == nullptr) return;
    if (result.size() == depth) result.push_back(vector<int>());
    result[depth].push_back(cur->val);
    order(cur->left, result, depth + 1);
    order(cur->right, result, depth + 1);
}

vector<vector<int>> levelOrder(TreeNode* root) {
    vector<vector<int>> result;
    int depth = 0;
    order(root, result, depth);
    return result;
}

3.4.2 迭代实现

vector<vector<int>> levelOrder(TreeNode* root) {
    queue<TreeNode*> que;
    if (root != NULL) que.push(root);
    vector<vector<int>> result;
    while (!que.empty()) {
        int size = que.size();
        vector<int> vec;
        for (int i = 0; i < size; i++) {
            TreeNode* node = que.front();
            que.pop();
            vec.push_back(node->val);
            if (node->left) que.push(node->left);
            if (node->right) que.push(node->right);
        }
        result.push_back(vec);
    }
    return result;
}

4 二叉树存储模式

二叉树的链式存储如下所示

在这里插入图片描述
二叉树的顺序存储如下所示

在这里插入图片描述

5 其他技巧

  • 二叉搜索树中序遍历得到的值序列是递增有序的

🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

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

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

相关文章

直觉微调——简化语言模型对齐过程

人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型在遵循指令和信任度方面仍有待提高。为了解决这一问题&#xff0c;研究者们提出了监督式微调&#xff08;Supervised Fine-Tuning, SFT&#xff09;和偏好优化&#xff08;Preference Optimization, PO&#xff09;两种方…

算法提高模板强连通分量tarjan算法

AC代码&#xff1a; #include<bits/stdc.h>using namespace std;typedef long long ll; const int MOD 998244353; const int N 2e5 10;//强联通分量模板 //tarjan算法 vector<int>e[N]; int n, m, cnt; int dfn[N], low[N], ins[N], idx; int bel[N];//记录每…

STL容器真的好用吗

大家都在用的c STL就一定是完美无缺的吗&#xff1f; 本文一针见血的指出常见STL顺序容器vector的致命bug。 在Scott Meyers的《Effective C》中&#xff0c;第一个条款明确指出&#xff0c;C是一个语言联邦。 这体现在&#xff1a; ● C&#xff1a;C继承了C语言的基础特性&a…

零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍

1. time模块 time()&#xff1a;获取当前时间戳&#xff0c;是一个数字 localtime()&#xff1a;返回一个time.struct_time对象&#xff0c;里面有年月日时分秒&#xff0c;还有星期几&#xff08;0表示星期一&#xff09;和今年的第几天 import timeprint(time.time()) pri…

我又被Spring的事务坑了,用户兑奖之后,什么东西都没收到!!

没错&#xff0c;我又被事务坑了&#xff01; 即上次的mq发送消息之后&#xff0c;业务代码回滚&#xff0c;导致发了一条中奖消息给用户&#xff01;&#xff01;&#xff0c;这次又被spring的事务坑了 这次是这样的&#xff0c;一个兑奖接口进来&#xff0c;我们先改变了这…

输入一段文字,瞬间生成应用。Furion低代码平台与AI协同工作,展现出非凡的效率与精准。

引言&#xff1a;展示问题背景 在当今快速变化的商业环境中&#xff0c;企业面临着前所未有的挑战。随着数字化转型的加速&#xff0c;企业对应用开发的需求日益增加。然而&#xff0c;传统的应用开发流程通常需要耗费大量时间和资源&#xff0c;从需求分析、设计、编码、测试到…

概念科普|ChatGPT是什么

一、引言 在人工智能的迅猛发展中&#xff0c;ChatGPT作为前沿技术的代表&#xff0c;其原理和运作方式成为了研究和讨论的热点。 常有观点将ChatGPT比喻为一种高级词语接龙&#xff0c;通过海量数据的学习与训练&#xff0c;机器能够根据给定的文本内容续写出下文&#xff0…

小米商业营销陈高铭:品牌应该多方整合,关注高质量营销 | SMARTIES CHINA 2024终审报道②

小米互联网业务部商业营销品牌总经理 陈高铭 近日&#xff0c;SMARTIES CHINA 2024终审活动在苏州音昱水中天落下帷幕。来自各行业的40位品牌广告主代表&#xff0c;历时两天时间&#xff0c;通过紧张的评审和精彩的讨论&#xff0c;从178个优秀入围案例中评选出了每个类别的金…

数据分析-螺旋环状气泡图

1 原理 采用阿基米德螺线原理&#xff0c;即以一个点匀速离开一个固定点的同时又以固定的角速度绕该固定点转动而产生的轨迹。具体原理见&#xff1a;阿基米德螺线。坐标轴公式为&#xff1a; 其中x为横坐标&#xff0c;y为纵坐标&#xff0c;r为离中心点的半径&#xff0c;为坐…

茶叶商家开店拓客线上发展增长生意

部分地区的人群酷爱喝茶&#xff0c;其他地区也有大量购茶者&#xff0c;其爱好者对茶叶的种类、年份季节口感度、价格等有着较高要求&#xff0c;花茶、绿茶、红茶、白茶、龙井、碧螺春、乌龙茶等&#xff0c;国内国外庞大市场&#xff0c;不能仅局限于本地附近客户&#xff0…

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS&#xff1a;栅格计算器原理及案例介绍 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍案例案例1&#xff1a;计算栅格数据平均值 参考 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍 描述&#xff1a;在类似计算器的界面中&#xff0c;…

跨境独立站支付收款常见问题排雷篇1.0丨出海笔记

最近小伙伴们在社群讨论挺多关于独立站支付问题的&#xff0c;鉴于不少朋友刚接触独立站&#xff0c;我整理了一些独立站支付相关的问题和解决方案&#xff0c;供大家参考&#xff0c;百度网上一堆媒体的那些软文大家就别看了&#xff0c;都是软广或者抄来抄去&#xff0c;让大…

华为 昇腾 310P 系列 AI 处理器支持 140Tops 的 AI 算力。

1、产品简介 模组是基于昇腾 310P 系列 AI 处理器设计而成&#xff0c;可实现图像、视频等多种数据分析 与推理计算。超强的视频编解码能力以及支持 140Tops 的 AI 算力。在边缘侧及端侧的嵌入式计算 领域&#xff0c;有着极高的性价比&#xff0c;具有超强算力、 超高能效、…

2024最新版mysql数据库表的查询操作-总结

序言 1、MySQL表操作(创建表&#xff0c;查询表结构&#xff0c;更改表字段等)&#xff0c; 2、MySQL的数据类型(CHAR、VARCHAR、BLOB,等)&#xff0c; 本节比较重要&#xff0c;对数据表数据进行查询操作&#xff0c;其中可能大家不熟悉的就对于INNER JOIN(内连接)、LEFT JOIN…

产业互联网新星闪耀,“太行云商”引领传统产业数字化革命

产业互联网新星升起 晋城&#xff0c;作为我国能源及相关产业的重要基地&#xff0c;一直面临着信息协同不畅、存货供需失衡、资金融通困难等诸多挑战。 2023年&#xff0c;为了应对这些难题&#xff0c;晋城市政府携手AMT企源&#xff0c;成立了太行云商科技有限公司&#x…

【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程蓝色飞机机身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件…

串口调试助手+串口打印配置

目录 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 2.打开main.c文件 在main函数中&#xff1a; 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 UART_HandleTypeDef huart1;void MX_USART1_UART_Init(void) {/* USER CODE BEGIN USART1_Init 0 …

【Proteus51单片机仿真】YL-69湿度检测和继电器电机自启动

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C51单片机&#xff0c;湿度检测模块通过ADC0832数模转换器&#xff0c;将模拟信号转换为数字信号给单片机&#xff0c;然后通过LCD1602显示屏显示出当前的湿度值&#xff0c;并判断当前湿度值是…

大模型的第一个杀手级应用场景出来了

大家终于都意识到大模型首先改变的是软件行业自己&#xff0c;而软件的根基是代码生成。代码生成第一波就是AI辅助开发&#xff0c;这个会是大模型第一个杀手级应用。大家苦苦逼问自己的大模型杀手级应用&#xff0c;为什么会是辅助编程&#xff0c;这里说下什么&#xff1a; 必…

数据集 Total-Text 文本检测 >> DataBall

开源数据集 Total-Text 文本检测 深度学习 人工智能 Total-Text 是一个文本检测数据集&#xff0c;由 1,555 张图像组成&#xff0c;具有多种文本类型&#xff0c;包括水平、多向和弯曲文本实例。训练分割和测试分割分别有 1,255 张图像和 300 张图像。 article{CK2019, author…