2.20数据结构与算法学习日记(二叉树第一部分)

1.树的表示

typedef int DadaType;
struct Node{struct Node* firstChild;struct Node* pnextBrotherDataType data;
};//树的表示

2.二叉树的简介

二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树具有以下特点:

1. 根节点:二叉树的顶端节点称为根节点,它没有父节点。
2. 子节点:每个节点最多有两个子节点,分别称为左子节点和右子节点。
3. 叶节点:没有子节点的节点称为叶节点。
4. 深度:从根节点到某个节点的唯一路径上的节点数称为该节点的深度。
5. 高度:从某个节点到叶节点的最长路径上的节点数称为该节点的高度。
6. 完全二叉树:除了最底层之外,每一层的节点都是满的,并且最底层的节点都靠左排列。
7. 满二叉树:每个节点要么没有子节点,要么有两个子节点。

二叉树可以用来表示表达式、文件系统、数据库索引等各种数据结构和算法问题。常见的二叉树遍历方式有前序遍历、中序遍历和后序遍历。

3.二叉树图例(部分)

1.普通二叉树

普通二叉树是一种最基本的二叉树,每个节点最多有两个子节点,分别称为左子节点和右子节点。普通二叉树没有特定的规则或性质,节点的插入和删除可以任意进行,因此它的形态和结构比较灵活。

以下是一个示例普通二叉树的图示:

```
        1
       / \
      2   3
     / \    / \
    4  5 6  7
```

在这个例子中,这是一个普通二叉树,每个节点最多有两个子节点,节点的插入和删除可以随意进行,没有特定的规则限制。普通二叉树常用于表示一般的树形结构,如文件系统、家谱等。

2.完全二叉树 

完全二叉树是一种特殊的二叉树,除了最底层之外,每一层的节点都是满的,并且最底层的节点都靠左排列。在完全二叉树中,如果某个节点的索引为i(从1开始),则它的左子节点的索引为2i,右子节点的索引为2i+1。

以下是一个示例完全二叉树的图示:

```
        1
       / \
      2   3
     / \    / 
    4  5 6  
```

在这个例子中,这是一个完全二叉树,因为每一层的节点都是满的,除了最底层的节点6之外,其他节点都是靠左排列的。完全二叉树常用于堆数据结构的实现,具有较好的性能特性。

3.满二叉树

满二叉树是一种特殊的二叉树,每个节点要么没有子节点,要么有两个子节点。除了叶节点外,每个节点都有两个子节点。满二叉树的叶节点都在同一层,且所有非叶节点的度都是2。

以下是一个示例满二叉树的图示:

        1
       / \
      2   3
     / \    / \
    4  5 6  7
 

在这个例子中,这是一个满二叉树,每个节点要么没有子节点,要么有两个子节点,所有非叶节点的度都是2。满二叉树在计算机科学中常用于堆数据结构的实现,具有一些特殊的性质和应用。

4.二叉树遍历

1.前序遍历

在前序遍历中,对于任意节点,先访问该根节点,然后递归地对其左子树进行前序遍历,最后递归地对其右子树进行前序遍历。

以下是一个示例二叉树的前序遍历顺序(节点值用数字表示):

        1/ \2   3/ \ / \4  5 6  7

前序遍历的结果为:1, 2, 4, 5, 3, 6, 7。

在这个例子中,前序遍历先访问根节点1,然后递归地对左子树进行前序遍历(2, 4, 5),最后递归地对右子树进行前序遍历(3, 6, 7)。

2.中序遍历

在中序遍历中,对于任意节点,先递归地对其左子树进行中序遍历,然后访问该节点,最后递归地对其右子树进行中序遍历。

以下是一个示例二叉树的中序遍历顺序(节点值用数字表示):

        1
       / \
      2   3
     / \    / \
    4  5 6  7

中序遍历的结果为:4, 2, 5, 1, 6, 3, 7。

在这个例子中,中序遍历先递归地对左子树进行中序遍历(4, 2, 5),然后访问根节点1,最后递归地对右子树进行中序遍历(6, 3, 7)。

3.后序遍历

它的遍历顺序是先递归地对左子树进行后序遍历,然后递归地对右子树进行后序遍历,最后访问根节点。(左,右,根)

在后序遍历中,对于任意节点,先递归地对其左子树进行后序遍历,然后递归地对其右子树进行后序遍历,最后访问该根节点。

以下是一个示例二叉树的后序遍历顺序(节点值用数字表示):

```
        1
       / \
      2   3
     / \    / \
    4  5 6  7
```

后序遍历的结果为:4, 5, 2, 6, 7, 3, 1。

在这个例子中,后序遍历先递归地对左子树进行后序遍历(4, 5, 2),然后递归地对右子树进行后序遍历(6, 7, 3),最后访问根节点1。

代码示例(单纯只是定义了函数)

#include<bits/stdc++.h>
using namespace std;
typedef int DadaType;
struct Node{struct Node* firstChild;struct Node* pnextBrotherDataType data;
};//树的表示
//二叉链
struct binaryTreeNode{struct binaryTreeNode* pleft;struct binaryTreeNode* pright;
}BTnode;
void PreOrder(BTnode *root){//前序遍历(根,左,右)if(root==NULL){printf("NULL");return;}printf("%d",root->data);PreOrder(root->pleft);PreOrder(root->pright);
}
void Inorder(BTnode *root){//中序遍历(左,根,右)if(root==NULL){printf("NULL");return;}Inorder(root->pleft);printf("%d",root->data);Inorder(root->pright);
}
void PostOrder(Btnode *root){//后序遍历(左,右,根)if(root==NULL){printf("NULL");}PostOrder(root->pleft);printf("%d",root->data);PostOrder(root->pright);
}
void destroyOrder(BTnode *root){if(root==NULL){return;}destroyOrder(root->pleft);destroyOrder(root->pright);free(root);root=NULL;
}

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

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

相关文章

现有的通用模型中融入少量中文数据没有太大意义少量的数据就能影响整个大模型

相关链接&#xff1a;只修改一个关键参数&#xff0c;就会毁了整个百亿参数大模型&#xff1f; | 新程序员-CSDN博客 现象 1&#xff1a;mBERT 模型的跨语言迁移 现象 2&#xff1a;大语言模型同样存在显著的语言对齐 现象 3&#xff1a;知识与语言分离 现象 4&#xff1a;…

unity学习(28)——登录功能

有之前注册的知识&#xff0c;登录就很容易处理了。 登陆成功返回id&#xff1a; 登录失败返回null&#xff1a; 测试同一账号不能重复登陆&#xff01;登录成功后最好可以跳到新的场景中 结果是好的&#xff0c;去服务器看一下对应部分的代码&#xff0c;可见&#xff0c;登…

MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案

项目场景 有时候&#xff0c;遇到数据库重复数据&#xff0c;需要将数据进行分组&#xff0c;并取出其中一条来展示&#xff0c;这时就需要用到group by语句。 但是&#xff0c;如果mysql是高版本&#xff0c;当执行group by时&#xff0c;select的字段不属于group by的字段的…

【FastAPI】P3 请求与响应

目录 请求路径参数查询参数 响应JSON 响应文本响应返回 Pydantic 模型 在网络通讯中&#xff0c;请求&#xff08;Request&#xff09; 与 响应&#xff08;Response&#xff09; 扮演着至关重要的角色&#xff0c;它们构成了客户端与服务器间互动的根本理念。 请求&#xff0…

代码随想录训练营第三十期|第三十七天|贪心算法 part06|● 738.单调递增的数字 ● 968.监控二叉树 ● 总结

738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int monotoneIncreasingDigits(int n) {String s String.valueOf(n);char[] chars s.toCharArray();int start s.length();for (int i s.length() - 2; i > 0; i--) {if (chars[i]…

60秒表达力训练法:快速提高表达能力,摆脱嘴笨带来的困扰

60秒表达力训练法&#xff1a;快速提高表达能力&#xff0c;摆脱嘴笨带来的困扰 很多人由于缺乏结构意识&#xff0c;总是很难把一部电影、一件刚看到的事&#xff0c;说得清清楚楚&#xff0c;这往往并不是逻辑能力的问题。 比如&#xff0c;很多程序员逻辑能力非常强&#…

Linux编辑器——Vim详解

目录 ⭐前言 ⭐vim的基本概念 ⭐vim的基本操作 ⭐vim命令模式命令集 ⭐vim末行模式命令集 ⭐简单vim配置 ⭐配置文件的位置 ⭐常用配置选项 ⭐前言 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容…

LeetCode刷题笔记之二叉树(二)

一、二叉树的翻转 1. 226【翻转二叉树】 题目&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。代码&#xff1a; class Solution {public TreeNode invertTree(TreeNode root) {//翻转二叉树&#xff0c;实际上就是交换左…

CMake的简单使用

一、一个最简单的CMake项目 在Ubuntu上使用CMake构建一个最简单的项目。 1. 安装CMake 首先安装CMake&#xff0c;这里使用的是Ubuntu系统。 sudo apt-get install cmake2. 编写源程序 编写代码&#xff0c;新建文件main.c。 // main.c #include "stdio.h"int …

Java学习笔记2024/2/20

今日作业&#xff1a; 题目1 完成课堂上所有练习 package test.test1; ​ import java.util.Random; ​ public class Test3 { ​public static void main(String[] args) {//键盘输入任意字符串&#xff0c;打乱里面的内容 ​//1.键盘输入任意字符串String str "abcd…

安卓adb调试备忘录

由于 MAC 的 USB 口全被占用着&#xff0c;采用无线连接刚方便&#xff0c;记录一下&#xff0c;以防忘记~ ADB原理 adb devices -l ## 列出连接的设备adb tcpip [端口号] adb tcpip 6666 # 将当前已连接USB上的Mobile端切换为TCP/IP模式&#xff0c;以6666端口进行监听. adb…

你真的了解—————NumPy吗

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;opencv &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x1f601; 喜欢的…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(8)模型训练

好吧&#xff0c;搞了半天&#xff0c;都是围绕数据在干活&#xff0c;这也就验证了&#xff0c;我们说的&#xff0c;数据准备等工作&#xff0c;要占到机器学习项目一半以上的工作量和时间。而且数据决定了模型的天花板&#xff0c;算法只是去达到上限。 我们今天来学习模型…

Java实现Redis延时队列

“如何实现Redis延时队列”这个面试题应该也是比较常见的&#xff0c;解答如下&#xff1a; 使用sortedset&#xff08;有序集合&#xff09; &#xff0c;拿时间戳作为 score &#xff0c;消息内容作为key 调用 zadd 来生产消息&#xff0c;消费者用zrangebyscore 指令获取 N …

暴力枚举刷题2

题目来源&#xff1a;烤鸡 - 洛谷 参考书目&#xff1a;参考书籍&#xff1a;《深入浅出程序设计竞赛&#xff08;基础篇&#xff09;》 解题思路&#xff1a;这道题可以用暴力枚举的方法解决&#xff0c;用10层for循环&#xff0c;再if判断就能找到所有符合的情况。因为 n 的…

2、windows环境下vscode开发c/c++环境配置(一)

前言&#xff1a;VSCode是微软出的一款轻量级编辑器&#xff0c;它本身只是一款文本编辑器而已&#xff0c;并不是一个集成开发环境(IDE)&#xff0c;几乎所有功能都是以插件扩展的形式所存在的。因此&#xff0c;我们想用它编程&#xff0c;不只是把vscode下载下来就行&#x…

数据分析 — 电商用户分析和用户 RFM 模型

目录 一、电商用户分析1、数据字段信息2、数据读取3、数据清洗4、可视化分析1、每年销售额的增长情况2、各个地区分店的销售额3、每个分店每一年的销售额4、销售淡旺季5、新增用户 二、RFM 模型1、RFM 模型的三个维度2、RFM 的客户类型标签3、RFM 模型的二分法思想4、代码 一、…

【C#小知识】c#中的delegate(委托)和event(事件)

今天来介绍一下delegate和event。delegate在c#中可以定义一个函数类型&#xff0c;可以将函数作为一个对象来使用。event在c#中则可以看做一个函数的集合&#xff0c;event中包含了一个或多个函数。 delegate using System;public class MyClass {//定义委托public delegate v…

计网day6

七 应用层 7.1 网络应用模型 7.2 DNS系统 7.3 文件传输协议FTP 7.4 电子邮件 7.5 万维网和HTTP协议

细数高德地图的发展史

根据2023年自然资源部公布的名单显示&#xff0c;以下公司通过“地图甲级测绘资质”换证审核&#xff0c;也就意味着&#xff0c;以下这些公司可以继续从事电子地图的采集和制作、商业合作等相关业务。 而这一点&#xff0c;对于以电子地图导航为主要业务支撑的企业至关重要。…