二叉树(数据结构篇)

数据结构之二叉树

二叉树

概念

  • 二叉树(binary tree)是一颗每个节点都不能多于两个子节点的树,左边的子树称为左子树,右边的子树称为右子树

性质

  • 二叉树实际上是图,二叉树相对于树更常用。

  • 平衡二叉树的深度要比节点数小很多,平均深度为O(n1/2)

  • 对于特殊类型的二叉树,即二叉查找树(binary search tree),平均深度为O(logN),最坏情况的二叉树深度能达到N-1。

image

先序遍历

  • 先处理根节点,再处理左子树,最后处理右子树
  • 处理左子树的时候,也是先处理左子树的根节点,再处理剩下的左子节点(或者子树),最后处理右节点(子树)
  • 处理右子树跟处理左子树的操作一样。

中序遍历

  • 先处理左子树,再处理根节点,最后处理右子树
  • 处理左子树时,也是先处理左子树的左子节点(子树),再处理左子树的根节点,最后处理左子树的右子节点(子树)
  • 处理完左子树,处理根节点
  • 处理完根节点,就处理右子树(跟处理左子树的操作一致)

后序遍历

  • 先处理左子树,再处理右子树,最后处理根节点
  • 处理左子树的时候,也是先处理左子树的左子节点(子树),再处理左子树的右子节点(子树),最后处理左子树的根节点。
  • 处理完左子树,再处理右子树(跟处理左子树的操作一致)
  • 处理完右子树,最后处理树的根节点

代码:

//二叉树,用left指向左子树节点,用right指向右子树节点
struct binarytree{int data;binarytree* left;binarytree* right;
};binarytree* createNode(int data){auto p=new binarytree;p->data=data;p->left=NULL;p->right=NULL;return p;
}//插入节点
void addchild(binarytree* &root,int data){binarytree* add= createNode(data);if(NULL == root) {root = add;}else{if(NULL == root->left){root->left=add;}else if(NULL==root->right){root->right=add;}else{cout<<"该根节点的子节点已满!"<<endl;}}
}//先序查找
binarytree* preorderSearch(binarytree* root,int data){if(NULL == root){return NULL;}if(root->data==data){return root;}binarytree* res;res=preorderSearch(root->left,data);if(NULL!=res){return res;}res=preorderSearch(root->right,data);if(NULL!=res){return res;}return NULL;
}//中序查找
binarytree* inorderSearch(binarytree* root,int data){if(NULL == root){return NULL;}binarytree* res;res=inorderSearch(root->left,data);if(NULL!=res){return res;}if(root->data==data){return root;}res=inorderSearch(root->right,data);if(NULL!=res){return res;}return NULL;
}//后序查找
binarytree* postorderSearch(binarytree* root,int data){if(NULL==root){return NULL;}binarytree* res;res= postorderSearch(root->left,data);if(NULL!=res){return res;}res= postorderSearch(root->right,data);if (NULL!=res){return res;}if(root->data==data){return root;}return NULL;
}//清空树
void destroy(binarytree* &root){if(NULL==root){return;}destroy(root->left);destroy(root->right);delete root;
}//删除节点
void del(binarytree* &root,int data){if(NULL == root){return;}binarytree* p=root;binarytree* tail=root->left;while (tail!=NULL){if(tail->data==data){if(NULL!=p->right){p->left=p->right;p->right=NULL;delete tail;return;}else{delete tail;p->left=NULL;return;}}del(tail,data);binarytree* temp=p;p=tail;tail=temp->right;}return;
}//先序遍历
void preorderprint(binarytree* root){if(NULL==root){return;}cout<<root->data<<" ";preorderprint(root->left);preorderprint(root->right);
}//中序遍历
void inorderprint(binarytree* root){if(NULL==root){return;}inorderprint(root->left);cout<<root->data<<' ';inorderprint(root->right);
}//后序遍历
void postorderprint(binarytree* root){if(NULL==root){return;}postorderprint(root->left);postorderprint(root->right);cout<<root->data<<' ';
}

尾言

完整版笔记也就是数据结构与算法专栏完整版可到我的博客进行查看,或者在github库中自取(包含源代码)

  • 博客1: codebooks.xyz
  • 博客2:moonfordream.github.io
  • github项目地址:Data-Structure-and-Algorithms

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

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

相关文章

关于addEventListener的使用和注意项

一、addEventListener基本理解 addEventListener 是一个 JavaScript DOM 方法&#xff0c;用于向指定元素添加事件监听器。它接受三个参数&#xff1a; 事件类型&#xff1a;一个字符串&#xff0c;表示要监听的事件类型&#xff0c;如 ‘click’、‘mouseover’、‘keydown’…

JS的设计原理

JavaScript 是一种基于原型的脚本语言&#xff0c;主要用于网页开发。它最初由 Brendan Eich 在 1995 年设计&#xff0c;并迅速成为万维网的核心技术之一。JavaScript 的设计原理包括以下几个方面&#xff1a; 1. 易用性和灵活性 JavaScript 被设计为一种简单易用的语言&…

scikit-image安装报错

scikit-image安装报错&#xff1a; pip install scikit-image0.21.0 报错信息&#xff1a; Collecting PyWavelets>1.1.1 (from scikit-image0.21.0) Installing build dependencies … error error: subprocess-exited-with-error 解决方法&#xff1a; 提前安装好PyWave…

正版 navicat 下载

1. 打开浏览器访问 navicat 官网 Navicat | 下载 Navicat Premium 14 天免费 Windows、macOS 和 Linux 的试用版 windows 用户选择这三项其中一个就可以 2. 下载 点击之后等个几秒钟就会开始下载了 3. 双击打开 下载好的 .exe 程序 进入安装程序 (不影响之前已经安装过的) 可…

客户ITSS案例 — 江苏中友讯华信息科技有限公司

● 2019年12月17日至12月20日&#xff0c;中国电子工业标准化技术协会信息技术服务分会&#xff08;以下称ITSS分会&#xff09;组织召开了运行维护服务能力成熟度符合性评估专家评审会。在江苏新世纪信息科技有限公司的咨询辅导下&#xff0c;江苏中友讯华信息科技有限公司顺利…

猫头虎分享已解决Bug || **Mismatched Types**: `mismatched types`

&#x1f42f; 猫头虎分享已解决Bug || Mismatched Types: mismatched types &#x1f42f; 关于猫头虎 大家好&#xff0c;我是猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发…

Zookeeper-04

Zookeeper-数据同步 Zookeeper是一个分布式协调服务&#xff0c;它可以用来管理和同步分布式系统中的数据。当多个节点需要共享数据时&#xff0c;它们可以通过Zookeeper来进行数据同步。 Zookeeper使用了一种称为“Zab”的一致性协议来保证数据的一致性。当一个节点需要向其…

ECharts 雷达图案例001-自定义节点动画

ECharts 雷达图案例001-自定义节点动画 引言 在数据可视化的领域中&#xff0c;ECharts 提供了一种强大的工具来展示多维数据。本文将介绍如何使用 ECharts 创建一个自定义节点样式的雷达图&#xff0c;让数据展示更加生动和个性化。 效果预览 通过自定义节点样式&#xff…

AI早班车2024.6.19

全球AI新闻速递 1.广东 / 山东警方破获两起“AI 换脸伪造不雅照”案。 2.腾讯混元、港科大、清华推出表情包框架&#xff1a;Follow Your Emoji。 3.抖音联合博纳影业推出首部 AIGC 科幻短剧集《三星堆&#xff1a;未来启示录》。 4.亚马逊&#xff1a;宣布向全球创企提供 …

【Java】BigDecimal类型——BigDecimal 为什么可以保证精度不丢失

目录 简介类介绍案例分析总结BigDecimal类型的使用场景MySQL中存储BigDecimal类型数据补充&#xff1a;BigDecimal类型使用时的注意事项BigDecimal类型的其他使用 简介 BigDecimal是Java中的一个类&#xff0c;用于处理大数运算。它提供了精确的数值计算&#xff0c;可以处理任…

真空玻璃可见光透射比检测 玻璃制品检测 玻璃器皿检测

建筑玻璃检测 防火玻璃、钢化玻璃、夹层玻璃、均质钢化玻璃、平板玻璃、中空玻璃、真空玻璃、镀膜玻璃夹丝玻璃、光栅玻璃、压花玻璃、建筑用U形玻璃、镶嵌玻璃、玻璃幕墙等 工业玻璃检测 钢化安全玻璃、电加温玻璃、玻璃、半钢化玻璃、视镜玻璃、汽车安全玻璃、汽车后窗电热…

Walrus:去中心化存储和DA协议,可以基于Sui构建L2和大型存储

Walrus是为区块链应用和自主代理提供的创新去中心化存储网络。Walrus存储系统今天以开发者预览版的形式发布&#xff0c;面向Sui开发者征求反馈意见&#xff0c;并预计很快会向其他Web3社区广泛推广。 通过采用纠删编码创新技术&#xff0c;Walrus能够快速且稳健地将非结构化数…

数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践

随着企业业务的不断发展&#xff0c;数据量往往呈现出快速的增长趋势。使用MySQL的用户面对这种增长&#xff0c;普遍选择采用分库分表技术作为应对方案。然而&#xff0c;这一方案常在后期会遇到很多痛点。 分库分表的痛点 痛点 1&#xff1a;难以保证数据一致性。由于分库分…

CCNA 0基础入门

OSI & TCP/IP OSI参考模型 TCP/IP协议 应用层 ------↓表示层 ------>应用层会话层 ------↑传输层 ------>传输层网络层 ------>网络互联层链路层 ------>网络接口层物理层 ------>↑ 物理层 传输的信号以及网线以及接线 主要作用是产生并检测电…

【python中的turtle库有哪些常用的方法】

turtle库是Python中一个非常流行的图形绘制库&#xff0c;用于绘制简单的图形和进行基础的动画编程。以下是turtle库中常用的一些方法&#xff1a; 画笔控制 penup(): 抬起画笔&#xff0c;移动时不留痕迹。pendown(): 放下画笔&#xff0c;移动时留下痕迹。pensize(width): …

高压电阻器支持牙科 X 射线成像的准确性

为了捕获患者牙齿和颌骨的足够图像&#xff0c;牙医依靠锥形束计算机断层扫描 &#xff08;CBCT&#xff09; 系统的先进 3D 成像。CBCT系统的输出对于准确诊断口腔健康问题和随后的治疗计划至关重要。为了确保这些图像的可靠性&#xff0c;CBCT系统制造商利用了Exxelia Ohmcra…

数据库 |试卷八试卷九试卷十

1.基数是指元组的个数 2.游标机制 3.触发器自动调用 4.count(*)统计所有行&#xff0c;不忽略空值null&#xff0c;但不但要全局扫描&#xff0c;也要对表的每个字段进行扫描&#xff1b; 5.eacherNO INT NOT NULL UNIQUE&#xff0c;为什么不能断定TeacherNO是主码&#xff…

Samtec制造理念系列一 | 差异变量的概念

【摘要/前言】 制造高端电子产品是非常复杂精密的过程。制作用于演示或原型的一次性样品可能具有挑战性&#xff0c;但真正的挑战在于如何以盈利的方式持续生产。 这就是Samtec风险投资研发工程总监Aaron Tucker在一次关于生产高密度微小型连接器的挑战的演讲中所强调的观点。…

游戏心理学Day19

玩家类型 玩家类型学的优势在于让设计师利用类型学原理&#xff0c;分析玩家心理&#xff0c;进而设计出相应的游戏和玩法。不过这类定制化选项还不少&#xff0c;不只是因为他们需要复杂的编程技术&#xff0c;还因为他们要求设计师详细描述极具弹性的玩家个性模型。这一模型…

基于Gunicorn、Flask与Docker实现高并发Web应用部署教程

在当今互联网高速发展的时代&#xff0c;高并发成为了Web应用必须要面对的挑战之一。为了应对这一挑战&#xff0c;我们可以利用Gunicorn、Flask和Docker等强大的工具来构建和部署高并发的Web应用。本文将详细介绍如何使用这些工具来构建一个高效、稳定的Web应用&#xff0c;并…