数据结构 | 二叉树的概念及前中后序遍历

news2024/10/5 19:14:21

数据结构 | 二叉树的概念及前中后序遍历

文章目录

  • 数据结构 | 二叉树的概念及前中后序遍历
    • 一、树概念及结构
      • 1.1 树的相关概念
    • 二、树的表示
      • 2.2 树在实际中的运用(表示文件系统的目录树结构)
    • 三、二叉树概念及结构
      • 3.1 二叉树的基本概念
      • 3.2 二叉树的结构:
        • a. 满二叉树(Full Binary Tree):
        • b. 完全二叉树(Complete Binary Tree):
        • c. 二叉搜索树(Binary Search Tree,BST):
    • 四、二叉树的应用
    • 五、二叉树的性质
    • 六、二叉树的存储结构
      • 6.1 顺序存储结构
      • 6.2 链式存储结构
      • 6.3 二叉树的顺序结构及实现
    • 七、二叉树链式结构的实现
    • 八、二叉树的遍历【重点】
      • 8.1 前序、中序以及后序遍历

一、树概念及结构

下面内容来自百度百科

  • 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。
  • 二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点 。
  • 常见的树结构包括二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)、AVL树、红黑树等。树的应用非常广泛,例如在数据库中的索引结构、文件系统的组织、图形算法中的优先队列等。

在这里插入图片描述

注意: 树形结构中,子树之间不能有交集,否则就不是树形结构

在这里插入图片描述

1.1 树的相关概念

树(Tree)是一种重要的数据结构,它在计算机科学中被广泛应用。树是由节点(Node)和边(Edge)组成的集合,节点之间通过边相连。树的一个特点是它是一个层次结构,顶部的节点称为根节(Root),最底部的节点称为叶节点(Leaf),中间的节点称为内部节点(Internal Node)。

在这里插入图片描述

节点的度: 一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
叶节点或终端节点: 度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点
非终端节点或分支节点: 度不为0的节点; 如上图:D、E、F、G…等节点为分支节点
双亲节点或父节点: 若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
孩子节点或子节点: 一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
兄弟节点: 具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
树的度: 一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
节点的层次: 从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
树的高度或深度: 树中节点的最大层次; 如上图:树的高度为4
堂兄弟节点: 双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
节点的祖先: 从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
子孙: 以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
森林: 由m(m>0)棵互不相交的树的集合称为森林;

二、树的表示

  • 有多种方法可以表示树,其中两种主要的表示方法是:儿子表示法(Child Representation)和父母表示法(Parent Representation)。此外,对于二叉树,还有更特定的表示方法,如数组表示法和链接表示法。

儿子表示法(Child Representation):

  • 在儿子表示法中,每个节点包含一个指向其所有子节点的指针。这种表示方法通常用于多叉树,其中一个节点可以有多个子节点。
    A
   / \
  B   C
 / \
D   E

父母表示法(Parent Representation):

  • 在父母表示法中,每个节点包含一个指向其父节点的指针。这种表示方法通常用于树的深度优先遍历。
codeA -> NULL
B -> A
C -> A
D -> B
E -> B

2.2 树在实际中的运用(表示文件系统的目录树结构)

  • 树结构在实际中广泛应用,而表示文件系统的目录树结构是树结构的一个典型应用之一。文件系统的目录结构可以很自然地用树来表示
  • 比如学过Linux的同学就知道这个linux是一个树状结构,就是/

在这里插入图片描述

三、二叉树概念及结构

  • 二叉树(Binary Tree)是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的结构和性质使得它在计算机科学中有着广泛的应用。

3.1 二叉树的基本概念

  • 节点(Node): 二叉树的基本单元,每个节点包含一个数据元素和指向左右两个子节点的指针。
  • 根节点(Root): 二叉树的顶端节点,是树的起始点,没有父节点。
  • 叶节点(Leaf): 没有子节点的节点称为叶节点,位于树的末端。
  • 内部节点(Internal Node): 除了根和叶节点之外的节点,有至少一个子节点的节点称为内部节点。
  • 子节点(Child): 一个节点的直接下层节点称为其子节点。
  • 父节点(Parent): 一个节点的直接上层节点称为其父节点。
  • 兄弟节点(Sibling): 具有相同父节点的节点称为兄弟节点。
  • 深度(Depth): 一个节点到根节点的路径长度称为节点的深度,根节点的深度为0。
  • 高度(Height): 一个节点到其最远叶节点的路径长度称为节点的高度,树的高度是根节点的高度。

3.2 二叉树的结构:

a. 满二叉树(Full Binary Tree):
  • 在满二叉树中,除了叶节点,每个节点都有两个子节点。所有叶节点都在同一层上。
        1
      /   \
     2     3
    / \   / \
   4   5 6   7
b. 完全二叉树(Complete Binary Tree):
  • 在完全二叉树中,除了最后一层的叶节点外,其他层都是满的,且最后一层的叶节点都靠左排列。
		1
      /   \
     2     3
    / \   /
   4   5 6
c. 二叉搜索树(Binary Search Tree,BST):
  • 在二叉搜索树中,每个节点的左子树都比该节点小,右子树都比该节点大,这使得查找、插入和删除等操作非常高效。
	    4
      /   \
     2     6
    / \   / \
   1   3 5   7

四、二叉树的应用

  1. 搜索和排序: 二叉搜索树用于实现快速的搜索和排序操作。
  2. 表达式树: 用于表示数学表达式,方便进行求值。
  3. 文件系统: 用于表示文件目录的层次结构。
  4. 编译器: 在语法分析阶段,使用语法树(通常是二叉树)表示程序的语法结构。
  5. 哈夫曼树: 用于数据压缩算法中构建最优的编码树。
  6. 游戏树: 在博弈论中,用于表示游戏的决策树。

五、二叉树的性质

  1. 每个节点最多有两个子节点: 每个节点最多有两个子节点,左子节点和右子节点。
  2. 每个节点有零个、一个或两个子节点: 这意味着一个节点可以是叶节点(没有子节点)、有一个子节点,或者有两个子节点。
  3. 左子树和右子树是有序的: 对于二叉搜索树(BST),左子树中的每个节点的值都小于该节点的值,右子树中的每个节点的值都大于该节点的值。
  4. 树的高度: 树的高度是从根节点到最深叶节点的最长路径。一棵有n个节点的二叉树的高度最多为n,最少为log₂(n+1)。
  5. 最后一层节点集中在左侧: 在完全二叉树中,最后一层的节点从左到右排列,缺失的位置只会出现在最右边。
  6. 满二叉树: 一棵高度为h且有2^h - 1个节点的二叉树被称为满二叉树。
  7. 完全二叉树: 一棵有n个节点的二叉树,如果从根节点到倒数第二层是一棵满二叉树,最后一层的节点都集中在左侧,那么它就是一棵完全二叉树。
  8. 节点的编号: 对于一棵二叉树,可以给每个节点按照从上到下、从左到右的顺序进行编号,编号从1开始。如果一个节点的编号为i,则它的左子节点的编号为2i,右子节点的编号为2i+1。

六、二叉树的存储结构

6.1 顺序存储结构

  • 在顺序存储结构中,使用数组来表示二叉树。具体的方式是按照从上到下、从左到右的顺序将二叉树的节点依次存储在数组中。如果一个节点的编号为i,则其左子节点的编号为2i,右子节点的编号为2i+1。

例如:

        1
       / \
      2   3
     / \ / \
    4  5 6  7
  • 对应的顺序存储结构为:
[1, 2, 3, 4, 5, 6, 7]
  • 这里数组的索引从1开始,根节点对应索引1,而左子节点和右子节点的关系则按照 2i 和 2i+1 的规则排列。

在这里插入图片描述

6.2 链式存储结构

  • 在链式存储结构中,每个节点通过指针或引用指向其左子节点和右子节点。这样的存储结构更加直观,也更容易实现。节点的定义如下:
struct TreeNode {
    int data; // 节点的数据
    TreeNode* left; // 指向左子节点的指针
    TreeNode* right; // 指向右子节点的指针
};
        1
       / \
      2   3
     / \ / \
    4  5 6  7

每个节点的 leftright 指针分别指向其左子节点和右子节点。这种存储结构更直观,但相对于顺序存储结构,可能会占用更多的内存空间。

在这里插入图片描述

在这里插入图片描述

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
	struct BinTreeNode* _pLeft; // 指向当前节点左孩子
	struct BinTreeNode* _pRight; // 指向当前节点右孩子
	BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
	struct BinTreeNode* _pParent; // 指向当前节点的双亲
	struct BinTreeNode* _pLeft; // 指向当前节点左孩子
	struct BinTreeNode* _pRight; // 指向当前节点右孩子
	BTDataType _data; // 当前节点值域
}

6.3 二叉树的顺序结构及实现

  • 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

在这里插入图片描述

  • 这里的二叉树的顺序结构及实现在另一篇博文介绍了,这里就不多介绍
  • 主要是堆的实现、堆排序和TOP-K问题

七、二叉树链式结构的实现

  • 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。

  • 我们先回顾一下二叉树的概念:

  1. 空树
  2. 非空:根节点,根节点的左子树、根节点的右子树组成的。

在这里插入图片描述

从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。

八、二叉树的遍历【重点】

8.1 前序、中序以及后序遍历

  1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。简单来说就是访问顺序就是 左子树 右子树
  2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。简单来说就是访问顺序就是 左子树 右子树
  3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。简单来说就是访问顺序就是 左子树 右子树

构建一棵树

BTNode* BuyTreeNode(int x)
{
	BTNode*node = (BTNode*)malloc(sizeof(BTNode));
	assert(node);

	node->data = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

BTNode* CreateTree()
{
	BTNode* node1 = BuyTreeNode(1);
	BTNode* node2 = BuyTreeNode(2);
	BTNode* node3 = BuyTreeNode(3);
	BTNode* node4 = BuyTreeNode(4);
	BTNode* node5 = BuyTreeNode(5);
	BTNode* node6 = BuyTreeNode(6);

	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;

	return node1;
}

二叉树的前序遍历

void BinaryTreePrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%d ", root->data);
	BinaryTreePrevOrder(root->left);
	BinaryTreePrevOrder(root->right);
}

二叉树中序遍历

void BinaryTreeInOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	BinaryTreeInOrder(root->left);
	printf("%d ", root->data);
	BinaryTreeInOrder(root->right);
}

二叉树后序遍历

void BinaryTreePostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	BinaryTreePostOrder(root->left);
	BinaryTreePostOrder(root->right);
	printf("%d ", root->data);
}

测试

int main()
{
	BTNode* root = CreateTree();

	printf("二叉树前序遍历:\n");
	BinaryTreePrevOrder(root);
	printf("\n");

	printf("二叉树中序遍历:\n");
	BinaryTreeInOrder(root);
	printf("\n");

	printf("二叉树后序遍历:\n");
	BinaryTreePostOrder(root);
	printf("\n");

	return 0;
}

在这里插入图片描述

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

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

相关文章

美林防火建材——朱林甫 坚韧与创新:美林传奇

在这个变幻莫测的时代,有一些创业者凭借着对行业的深刻理解和对未来的敏锐洞察,不仅在商海中乘风破浪,更是引领了整个行业的发展。今天,我们要讲述的,就是一位这样的创业者——来自浙江嘉善的朱总,他创立的…

Python 文件读写

Python 文件读写笔记整理 参数说明 open(path, flag[, encoding][,errors]) path:要打开文件的路径 flag:打开方式 encoding:编码方式 errors:错误处理 Flag打开方式表 模式 描述 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb 以二进制格…

echarts x轴y轴添加单位

function evaluationDistributionBar(data,id) { //data.series[0].data [1,31,1,1]//data.series[1].data [1,1,1,1]if(!data || data.series.length 0) returnfor(let i in data.series){//给柱状图动态修改颜色if(data.series[i].name 男){data.series[i].itemStyle {c…

什么牌子的led台灯质量好?考研必备五款护眼台灯推荐

眼睛更是心灵的窗户,我们通过这扇窗来欣赏这个美好的世界。而如今,近视在儿童中已司空见惯,近视率逐年提高,并且低龄化的现状更加突出。据世界卫生组织的最新研究报告,目前中国近视患者人数多达6亿,其中我国…

Sui与阿联酋科技孵化器Hub71合作支持生态项目建设,扩大全球影响力

近日,总部位于阿联酋( United Arab Emirates ,UAE)的科技孵化器Hub71宣布与Mysten Labs合作,将支持Sui上的新项目。通过本次合作,孵化项目的开发者们不仅可以获得Mysten Labs的技术专业知识和支持&#xff…

供应商关系管理软件:如何使用它来改善供应商关系?

从最基本的角度来说,企业需要供应商为其生产和销售的产品或服务提供原材料,或者为其提供资源和服务来经营自己的业务。 建立稳定而健康的供应商关系的最大优势之一,就是可以为企业带来更高的价值。企业对供应商了解越多,供应商对…

kerberos的认证过程以及白银黄金票据

kerberos协议 背景 1、1000台电脑,员工可以在任意电脑上登录自己的账户,每台电脑建立1000个用户 2、现有一台打印机服务,员工想要访问有两种方式,一种直接链接网线,第二种实现认证后,多个主机使用一台打印…

程序包不存在

idea2020会有一个小bug&#xff0c;在idea的Settings设置中进行下面配置&#xff1a; 然后在maven项目下的pom.xml中加入如下代码&#xff1a; <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifact…

CVE-2023-25573:MeterSphere 任意文件下载漏洞复现[附POC]

文章目录 MeterSphere 任意文件下载&#xff08;CVE-2023-25573&#xff09;漏洞复现[附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 MeterSphere 任意文件下载&#xff08;CVE-2023-25573&#xff09;漏洞…

基于SSM线上旅行信息管理系统设计与实现

摘 要 随着旅游业的迅速发展&#xff0c;传统的旅行信息查询管理方式&#xff0c;已经无法满足用户需求&#xff0c;因此&#xff0c;结合计算机技术的优势和普及&#xff0c;特开发了本线上旅行信息管理系统。 本论文首先对线上旅行信息管理系统进行需求分析&#xff0c;从系…

Abbyy FineReader16最新版本有哪些新功能?

在数字化时代&#xff0c;数据处理和转换变得非常重要&#xff0c;Abbyy FineReader 就是一款专门用于处理、转换和识别图像和 PDF 文件的软件。在本文中&#xff0c;我们将会详细介绍 Abbyy FineReader 的功能以及适合使用该软件的电脑。 ABBYY Finereader 16-安装包下载如下&…

echarts折线图的线呈现动态效果

效果如图 let yData [222, 932, 66, 934, 111, 333, 0],xData ["测1", "测2", "测3", "测4", "测5", "测6", "测7"],datacoords [{coords: [],},];for (var i 0; i < xData.length; i) {datacoo…

抖音自动评论助手,开发流程与需要到的技术和代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 随着互联网的快速发展&#xff0c;短视频平台已成为人们日常生活的重要组成部分。其中&#xff0c;抖音作为一款深受用户喜爱的短视频平台&#xff0c;拥有庞大的用户群体…

Visual Studio 2022分析C#程序内存泄漏

背景 最近我们的项目出现了内存激增的情况&#xff0c;初次探讨&#xff0c;我们发现和机器人发生通信之后&#xff0c;内存会缓慢上升&#xff0c;直到系统崩溃。 例子 由于只是介绍一个简单的方案&#xff0c;所以就写一个比较简单的例子来演示了&#xff0c;代码如下&…

MySQL进阶知识:SQL性能优化

目录 SQL性能分析 SQL执行频率 慢查询日志 profile详情 explain执行计划 索引的使用 最左前缀法则 范围查询 索引列运算 字符串加引号 模糊查询 or连接的条件 数据分布影响 SQL提示 覆盖索引 前缀索引 索引设计原则 SQL优化 insert优化 主键优化 页分裂 …

JS动态转盘可自由设置个数与概率

让我为大家介绍一下转盘的实现过程与原理&#xff0c;介绍都放在下面代码块中&#xff0c;一步一步的教会你。 我们转盘使用线段来实现 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style type&quo…

【Jmeter性能测试】ForEach控制器的用法解析

引言 最近我在进行JMeter性能测试时遇到了一些问题&#xff0c;特别是在使用ForEach控制器时感到有点棘手。 但是经过不断地摸索和实践&#xff0c;终于成功地掌握了这个神奇的工具&#xff0c;提高了我的测试效率。因此&#xff0c;今天我想和大家分享我的经验&#xff0c;让…

“逆风飞翔·事实孤儿同行计划”成长陪伴主题区域陪伴培训会

为推进各机构更好地开展事实孤儿成长陪伴工作&#xff0c;促进事实孤儿成长陪伴实施成效&#xff0c;搭建各机构间事实孤儿成长陪伴方式方法交流平台。11月26日&#xff0c;在中国乡村发展基金会、中国民生银行的支持下&#xff0c;由湖南省大爱无疆青少年公益发展中心主办&…

社区内涝积水监测系统作用,改善社区积水

随着社区化进程的加速&#xff0c;社区基础设施的重要性日益凸显。在这个背景下&#xff0c;社区生命线和内涝积水监测系统成为了关注的焦点。它们在维护社区安全&#xff0c;特别是在应对暴雨等极端天气条件下&#xff0c;发挥着至关重要的作用。 WITBEE万宾时刻关注社区内涝积…

【JavaEE初阶】volatile 关键字、wait 和 notify

目录 一、volatile 关键字 1、volatile 能保证内存可见性 2、volatile 不保证原子性 二、wait 和 notify 1、wait()方法 2、notify()方法 3、notifyAll()方法 4、wait 和 sleep 的对比 一、volatile 关键字 1、volatile 能保证内存可见性 我们前面的线程安全文章中&…