一、二叉树

1、树

   1)概念        

        树是 n(n >= 0) 个结点的有限集合。若 n=0 ,为空树。

        在任意一个非空树中:

          (1)有且仅有一个特定的根结点;

          (2)当 n>1 时,其余结点可分为 m 个互不相交的有限集合T1、T2......Tm,其中每一个集合又是一个树,并且称为子树。

   2)度、度数、深度

        结点拥有子树的个数称为结点的。度为 0 的结点称为叶结点;度不为 0 称为分支结点。

        树的度数:指在这颗树中,最大的结点的度数,称为树的度数。

        树的深度(高度):指从根开始,根为第一层,根的孩子为第二层,即树的层数,称为树的深度。

        树的存储:顺序结构、链表结构。

2、二叉树(binary tree)

  1)概念

        二叉树是 n 个结点的有限集合,集合要么为空树,要么由一个根节点和两棵互不相交的树组成,这两棵树分别称为根节点的左子树和右子树。

  2)特点

     (1)每个结点最多两个子树。

     (2)左子树和右子树是有顺序的,次序不能颠倒。

     (3)如果某个结点只有一个子树,也要区分左、右子树。

  3)特殊的二叉树

     (1)斜树

        斜树分为两种,一种是所有的结点都只有左子树,称为左斜树;另一种是所有的结点都只有右子树,称为右斜树。

        (2)满二叉树

        满二叉树是指所有的分支结点都存在左右子树,并且叶子都在同一层上。

        (3)完全二叉树

        完全二叉树是指:对于一颗具有 n 个结点的二叉树按照层序编号,如果编号 i( 1<= i <= n )的结点于同样深度的满二叉树中编号为 i 的结点在二叉树中的位置完全相同,则此树称为完全二叉树。

    4)特性

       (1)在二叉树的第 i 层上最多有 2^(i-1) 个结点,i >= 1。

       (2)深度为 k 的二叉树至多有 2^k-1 个结点,k >= 1。

       (3)任意一个二叉树T,如果其叶子结点的个数为 N,度数为 M,则 N=M+1。

       (4)有 n 个结点的完全二叉树深度为(logn / log2)+ 1。

   5)层序

        前序:根左右。先访问根结点,再访问左结点,最后访问右结点。

        中序:左根右。先从根结点开始(不是先访问根结点),从左结点开始访问,再访问根结点,最后访问右结点。

        后序:左右根。先从根结点开始(不是先访问根结点),从左结点开始访问,再访问右结点,最后访问根结点。

     6)二叉树的函数应用

        (1)创建二叉树函数

void CreateTree(BiTNode **root)
{char c = data[ind++];if('#' == c){*root = NULL;return ;}else{*root = malloc(sizeof(BiTNode));if(NULL == *root){printf("malloc error\n");*root = NULL;return ;}(*root) -> data = c;CreateTree(&(*root) -> ichild);CreateTree(&(*root) -> rchild);}return ;
}

       ( 2)根左右(前序)函数封装

//根左右
void PreOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}else{printf("%c", root -> data);PreOrderTraverse(root -> ichild);PreOrderTraverse(root -> rchild);}return ;
}

      (  3)左根右(中序)函数封装

//左根右
void InOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}InOrderTraverse(root -> ichild);printf("%c", root -> data);InOrderTraverse(root -> rchild);return ;
}

        (4)左右根(后序)函数封装

//左右根
void PostOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}PostOrderTraverse(root -> ichild);PostOrderTraverse(root -> rchild);printf("%c", root -> data);return ;
}

        (5)二叉树销毁函数封装

//销毁
void DestroyTree(BiTNode *root)
{if(NULL == root){return ;}DestroyTree(root -> ichild);DestroyTree(root -> rchild);free(root);return ;
}

       ( 6)头文件与其余声明

#include <stdio.h>
#include <string.h>
#include <stdlib.h>typedef char DATATYPE;typedef struct BiTNode
{DATATYPE data;struct BiTNode *ichild, *rchild; 
}BiTNode;char data[] = "Abd#g###ce#h##fi###";
int ind = 0;

       ( 7)主函数运行格式

int main(int argc, char **argv)
{BiTNode *root;CreateTree(&root);PreOrderTraverse(root);printf("\n");InOrderTraverse(root);printf("\n");PostOrderTraverse(root);printf("\n");DestroyTree(root);root = NULL;return 0;
}

二、gbd调试指令

        gdb 调试指令用来寻找段错误。

1、一般调试

      1)gcc -g 文件名

      2)gbd ./a.out (a.out 为该函数的可执行文件)

      3)b  函数名   设置断点,运行到这个函数位置,程序自动暂停

              b   数字     运行到 main函数的这一 “数字” 行,程序自动暂停

      4)r  运行

      5)n  执行下一步(行)步过,若是函数,直接调用结束

      6)p  使用p命令,查看变量或指针等数据,p a(变量); p *a(指针)

2、其他相关命令

      1)bt  与 where  显示栈结构,函数的调用关系

      2)s  步入,如果是函数,进入函数

      3)c  跳出循环,在循环后面设置断点,然后按 c 可返回调用处

      4)display  和 p 相似,一直显示变量

      5)q  退出 gbd 操作界面

三、各类排序算法的时间复杂度

1、概念

        时间复杂度是衡量算法执行效率的重要指标,描述了算法的运行时间随输入规模(n)增长而变化的趋势,而非具体的运行时间。

2、推导大O阶方法

        1)用常数 1 取代运行时间中的所有加法常数。

        2)在修改后的运行次数函数中,只保留最高阶项。

        3)如果最高阶项存在且不是 1 ,则去除与这个项相乘的常数。

得到的结构就是大O阶。

3、表示方法

        采用大O符号(Big O Notation)来表示,忽略了常数项、低阶项和系数,只保留对增长趋势影响最大的项。例如下图:(图中 阶 代表时间复杂度)

4、常见时间复杂度(按效率高到低排序)

   1)常数阶 O(1)

        算法执行时间不随规模 n 变化,始终为固定步骤,如访问数组中的某个元素。

   2)对数阶 O(log n)

        执行时间随 n 增长,但增长速度极慢(每步可将问题规模缩小一半),如二分查找。

   3)线形阶 O(n)

        执行时间与 n 成正比例增长,如线性查找。

   4)线形对数阶 O(n log n)

        效率介于 O(n) 和 O(n^2) 之间,常见于高效排序算法,如快速排序、归并排序。

   5)平方阶 O(n^2)

        执行时间与 n 的平方成正比,适用于小规模数据,如冒泡排序。

   6)指数阶 O(2^n)、阶乘阶 O(n!)4

        效率极低,随 n 增长,执行时间呈爆炸式增长,仅适用于极小规模数据。

5、各类算法时间复杂度整理

常用的时间复杂度所耗费的时间从小到大依次是:

【END】

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全基础DAY1-安全概述

信息安全现状及挑战常见术语信息安全的脆弱性及常见攻击网络环境的开放性其实就是人人可以上网&#xff0c;网上零成本。协议栈自身的脆弱性及常见攻击协议栈自身的脆弱性常见安全风险网络的基本攻击模式物理层--物理攻击前置知识 1.打开Apache服务 cd /etc/init.d ./apache2 s…

Claude Code 的核心能力与架构解析

技术分析介绍&#xff1a;Claude Code 的核心能力与架构解析一、概述 Claude Code 是由 Anthropic 推出的面向开发者的智能编码助手&#xff0c;它不仅仅是一个代码生成工具&#xff0c;更是一个具备记忆、工具调用、自主规划和环境感知能力的“智能代理”&#xff08;Agentic …

Mac 电脑放在环境变量中的通用脚本

mac电脑下放在环境变量中&#xff0c;方便提高效率执行 注&#xff1a;相关路径需要根据实际情况进行更新 需要在 .bash_profile 文件中定义如下&#xff08;路径需要做实际替换&#xff09;&#xff1a; source $HOME/software/scripts/base_profile.sh source $HOME/software…

UE蓝图节点Add Impulse和Add Torque in Radians

​​​​​​​Add Impulse&#xff1a;对刚体施加一次性的线性脉冲&#xff08;瞬时改变量&#xff09;&#xff0c;改变速度&#xff08;与质量有关&#xff0c;除非你勾 bVelChange&#xff09;。Add Torque (in Radians)&#xff1a;对刚体施加转矩/旋转力&#xff08;向量…

大型语言模型幻觉检测与缓解技术研究综述

摘要 本文系统综述了大型语言模型(LLMs)中的幻觉现象及其检测与缓解技术。研究首先从认知机制角度分析了幻觉产生的理论根源&#xff0c;包括模型对语言先验的过度依赖、训练数据偏差以及推理过程中的信息衰减等问题。在技术层面&#xff0c;综述将现有方法归纳为三类&#xff…

【数据结构初阶】--二叉树(二)

&#x1f618;个人主页&#xff1a;Cx330❀ &#x1f440;个人简介&#xff1a;一个正在努力奋斗逆天改命的二本觉悟生 &#x1f4d6;个人专栏&#xff1a;《C语言》《LeetCode刷题集》《数据结构-初阶》 前言&#xff1a;上篇博客我们学习了有关树的概念和相关术语的介绍&…

jmm 指令重排 缓存可见性 Volatile 内存屏障

CPU指令重排 CPU指令重排是指CPU为了提高指令执行效率&#xff0c;可能会对指令的执行顺序进行优化&#xff0c;使得&#xff08;单线程下&#xff09;指令的实际执行顺序与代码中的顺序不同&#xff0c;但结果是一致的。 这种优化是通过乱序执行和缓存读写重排来实现的。 乱序…

卡车手机远程启动一键启动无钥匙进入有哪些好处

随着汽车科技的发展&#xff0c;卡车智能化升级已成为趋势&#xff0c;其中手机控车、远程启动、无钥匙进入及一键启动等功能显著提升了驾驶便捷性与安全性。以下从功能特点、技术原理、适用场景及改装建议等方面展开说明。一、核心功能及技术特点1. 无钥匙进入系统自动感应操作…

【pyqt5】SP_(Standard Pixmap)的标准图标常量及其对应的图标

目录 **常见SP_图标分类及用途** **1. 箭头和导航图标** **2. 文件和编辑操作** **3. 系统状态和通知** **4. 应用程序和菜单** **5. 数据视图控件** **完整列表(部分)** **使用建议** **6. 数据操作图标** **7. 编辑和文本操作** **8. 媒体控制图标** **9. 系统和应用状态**…

VS Git巨坑合并分支失败导致多项无关改变

基于主分支创建的临时分支上进行了一些开发&#xff0c;合并回主分支&#xff0c;期间主分支没有进行任何更改还是创建临时分支时的状态&#xff0c;但合并莫名其妙报错 “1 uncommitted …”&#xff0c;我可以确认主分支和临时分支均没有尚未提交的更改。更恶心的是&#xff…

开始记录U9客开过程中听点滴

很久没有更新了。终于有时间可以拾起U9的研究当中。时间长了就生疏了很多&#xff0c;记录下来备查吧。用这个工具可以生成一个VS 2022的项目&#xff0c;在指定的地方写自已的代码既可。BE插件&#xff0c;Busing Plugin 商业插件。总结一下&#xff0c;BE插件是应用于某一个单…

C# 异步编程(使用异步Lambda表达式)

使用异步Lambda表达式 到目前为止&#xff0c;本章只介绍了异步方法。但我们曾经说过&#xff0c;你还可以使用异步匿名方法和异步 Lambda表达式。这些构造尤其适合那些只有少量工作要做的事件处理程序。下面的代码片段将 一个表达式注册为一个按钮点击事件的事件处理程序。 st…

K8S云原生监控方案Prometheus+grafana

目录 1. 概述 1.1 系统架构 1.1.1 架构图 ​编辑 1.2 环境准备 2. 部署prometheus 2.1 创建Namespace 2.2 创建ConfigMap资源 2.3 创建ServiceAccount&#xff0c;Clusterrole&#xff0c;Clusterrolebinding&#xff0c;Service&#xff0c;Deployment&#xff0c;in…

Matplotlib库:Python数据可视化的基石,发现它的美

Matplotlib是Python中最基础、最广泛使用的数据可视化库&#xff0c;它提供了类似MATLAB的绘图接口&#xff0c;能够创建高质量的静态、动态和交互式图表。作为科学计算和数据可视化的核心工具&#xff0c;Matplotlib几乎成为Python数据科学生态系统的标准可视化组件。 今天与…

每日算法刷题Day59:8.9:leetcode 队列8道题,用时2h30min

一、基础 1.套路 1.队列常用在 BFS 中&#xff0c;见 网格图题单 和 图论题单。 2.队列(queue)是容器适配器&#xff0c;功能较少。 队尾插入元素&#xff0c;队首弹出元素&#xff0c;可以访问队首元素、队尾元素和队列长度。 无begin(),end()等迭代器 queue<int> qu…

Java选手如何看待Golang

写在前面&#xff1a;翻了很多博客&#xff0c;一直没有Java选手转行golang的学习经验贴&#xff0c;思考很久&#xff0c;写下这篇Java选手怎么看待golang这个冉冉新星。1.走完所有golang基础之后的感受&#xff08;1&#xff09;最大的不适应有这么几点&#xff1a;---变量定…

Codeforces Round 967 (Div. 2) D. Longest Max Min Subsequence

假设我们要选a[j]为答案数组b[i]&#xff0c;从i从1~m&#xff08;m为a数组中不同数的个数&#xff09;建立一个suf数组&#xff0c;代表以i开头的后缀有多少个不同且在b[1~i-1]中未出现过的的个数&#xff0c;预处理suf&#xff0c;发现后续我们怎么选数改变suf&#xff0c;su…

Linux运维新手的修炼手扎之第27天

mysql服务1 主从复制集群&#xff1a;多主机集群【复制】负载过大解决方案&#xff1a;横向扩展[增加服务器节点分散负载]、纵向扩展[提升单机硬件性能]复制工作原理&#xff1a;前提&#xff1a;基础数据一样&#xff0c;主节点上有同步数据用的账号主角色【二进制日志、binlo…

【Linux】Linux增删改查命令大全(附频率评级)

Linux增删改查命令大全&#xff08;附频率评级&#xff09;* 《Linux命令全景手册&#xff1a;增删改查全场景解析&#xff08;含136个高频命令&#xff09;》 按使用频率★分级 | 测试/运维/开发均适用 | 附思维导图下载一、命令全景表&#xff08;增删改查频率评级&#xff0…

SwiftUI 登录页面键盘约束冲突与卡顿优化全攻略

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…