二叉树的创建及遍历方法

article/2025/9/22 6:15:09

目录

1、二叉树的定义及特点

2、满二叉树和完全二叉树的概念

3、二叉树的存储结构

4、创建二叉树

5、树的四种遍历方法

6、结果及其分析


1、二叉树的定义及特点

        二叉树是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左孩子树和右孩子树组成的非空树;左子树和右孩子树又同样都是二叉树 。    

        二叉树是由m(m>=0)个节点组成的有限集合,二叉树一个节点的子节点应该为n(n<=2),并且二叉树严格区分左孩子和右孩子。        

        二叉树的特点:
                在k层中的最大节点个数为 2^(k-1);
                层数为k的树的最大节点个数为 2^k -1;
                叶节点的个数比度数为2的节点的个数要多1个: n0 = n2+1               

                总节点数为各类节点之和:n=no+n1+n2
                总节点数为所有子节点数加一: n= n + 2*n2+ 1      故得: no=n2+1

2、满二叉树和完全二叉树的概念

要实现二叉树的遍历,我们还需要了解什么是满二叉树和完全二叉树:

满二叉树:深度为k (k≥1)时有2k-1个节点的二叉树。


完全二叉树:只有最下面两层有度数小于2的节点,且最下面一层的叶节点集中在最左边的若干位置上。具有n个节点的完全二叉树的深度为
                                        (log2n)+1  或  log2(n+1)

3、二叉树的存储结构

        二叉树的存储方式即可以选择顺序存储,也可以选择链式存储,但考虑到内存占用的问题,大多数情况下我们都采用链式存储,此处我们也采用链式存储进行树的遍历。

         如图所示,要实现二叉树的链式存储,我们需要在结构体定义环节对每个节点的左孩子节点和右孩子节点的地址进行保存;因此结构体定义应该如下所示:

typedef char data_t;typedef struct tree
{data_t data;//存放本节点数据struct tree *l_child;//存放左孩子节点地址struct tree *r_child;//存放右孩子节点地址
}Tree;

4、创建二叉树

        结构体定义完成,接下来我们创建二叉树:

Tree *Create_Tree()
{Tree *root;char ch;scanf("%c", &ch);//通过输入的ch是否为特殊符号来判断该节点是否有孩子节点if(ch == '#'){	//不存在孩子节点return NULL;}else{root = (Tree *)malloc(sizeof(Tree));if(NULL == root){printf("创建失败\n");return NULL;}root->data = ch;root->l_child = Create_Tree();//存在左孩子节点,递归调用本函数,使得左孩子节点先被赋值root->r_child = Create_Tree();return root;}
}

        在这段代码中我们需要来看一下二叉树创建的原理:

        按照一般的存储逻辑,我们一般存储都是按照如下编号逐个存储,但是这样的存储方式不太适用于我们的链式存储,因此,这里我们需要使用到递归存储。

 接下来,我们构思一下递归思路:

        要实现递归,首先我们需要思考哪些步骤是重复多次进行的?在这里我们发现,我们每次存储时,基本上都是按照从上到下,从左到右的方式进行存储的,所以,我们此处存储数据时,可以先把根节点下面的左子树先存放完成,再存放右子树即可实现数据存储,并且,我们存放玩上一个数据之后的每一个节点都可以看做是一个根节点。这样,我们的递归思路大致就为:

        1、判断一个根节点是否有孩子,如果有执行下一步,没有返回NULL

        2、创建一个新的节点保存数据

        3、存在左孩子节点,将左孩子节点作为下一个根节点进行操作(递归调用本函数)

        4、左孩子数据存放玩,存在右孩子,将左孩子节点作为下一个根节点进行操作(递归调用本函数)

        通过以上步骤之后,我们的树就建起来啦!!!

5、树的四种遍历方法

        接下来,我们通过三种递归遍历输出我们的结果检查一下:

1、先序遍历(即按照根节点,左孩子树,右孩子树的顺序遍历)

void Preorder_Tree(Tree *root)
{if(NULL == root){return;}printf("%c ", root->data);//输出当前节点的数据Preorder_Tree(root->l_child);//将子节点作为下一个根节点遍历左孩子数Preorder_Tree(root->r_child);//将子节点作为下一个根节点遍历左孩子数
}

2、中序遍历(即按照左孩子树,根节点,右孩子树的顺序遍历)

void Mediate_Tree(Tree *root)
{if(NULL == root){return;}Mediate_Tree(root->l_child);printf("%c ", root->data);Mediate_Tree(root->r_child);
}

3、后续遍历(即按照左孩子树,右孩子树,根节点的顺序遍历)

void Post_Tree(Tree *root)
{if(NULL == root){return;}Post_Tree(root->l_child);Post_Tree(root->r_child);printf("%c ", root->data);
}

4、层次遍历

void Level_Tree(Tree *tree)
{if(tree == NULL){return;}Tree *pos[N];int front, rear;//对头指针和对尾指针,用于出队和入队操作rear = N;while(rear--){pos[rear] = NULL;//全部置为空,方便后续判断}front = rear = 1;//此时为空队列,都指向第一个元素pos[front] = tree;rear++;//对尾指针偏移一位,用于存放新数据while(pos[front] != NULL){printf("%c ", pos[front]->data);if(pos[front]->l_child != NULL){pos[rear] = pos[front]->l_child;//左孩子节点入队rear++;}if(pos[front]->r_child != NULL){pos[rear] = pos[front]->r_child;//右孩子节点入队rear++;//尾指针偏移}front++;//头指针偏移一位判断下一个元素		}		
}

        由于层次遍历涉及队列,逻辑上比较复杂,所以本期暂时不详细解释这段代码,后期会专门出一期层次遍历二叉树的教程,有兴趣的同学可以关注以下。

       

6、结果及其分析

接下来运行结果:

         我们在输入树的内部数据时,需要使用特殊符号先将树补充为完全二叉树,即所有节点都必须有两个子节点,单个节点也需要补,如上图所示。

        输入数据时从上到下,从左到右,所以依次输入AB#CD###E#FGH##K###

        

         以上为前三种遍历方法的输出,层次输出的结果则是从最上面一层一直输出到最下面一层,输出结果正确。

        以上就是本期内容,欢迎参考指正,如有不懂,评论出下期!!!


http://chatgpt.dhexx.cn/article/w8iPHDVE.shtml

相关文章

二叉树遍历(图解)

二叉树的顺序存储结构就是用一维数组存储二叉树中的节点&#xff0c;并且节点的存储位置&#xff0c;也就是数组的下标要能体现节点之间的逻辑关系。—–>一般只用于完全二叉树 链式存储—–>二叉链表 定义&#xff1a; lchild | data | rchild&#xff08;两个指针域&…

图解二叉树及二叉树遍历

二叉树及二叉树遍历 完全二叉树二叉树的遍历遍历的性质 1、完全二叉树 对于一棵具有n个节点的二叉树&#xff08;按层序编号&#xff09;&#xff0c;如果编号为i的节点与同样深度的满二叉树中编号为i的节点在二叉树的位置完全相同&#xff0c;则为完全二叉树。 换句话来说&a…

数据结构--二叉树遍历(详细过程)

目录 一、什么是二叉树&#xff1f; 二、二叉树的遍历 1. 先序遍历 2. 中序遍历 3.后序遍历 4. 遍历的推导 三、重要的事情 一、什么是二叉树&#xff1f; 1. 二叉树&#xff1a;一种树形结构&#xff0c;特点是每个结点至多只有两颗子树&#xff0c;并且子树有左右之分…

图解法:三分钟掌握二叉树的三种遍历

二叉树作为树中的一种特殊存在机制&#xff0c;人们对于它的排序总结出来了三种方式&#xff0c;让我们一起探寻它的魅力吧&#xff01; 测试对象 1.先序遍历 首先看一下排序规则 先访问根节点 再先序访问左子树 再先序访问右子树 看上面的素材&#xff0c;得知根节点为…

二叉树的各种遍历算法以及实例

一、二叉树 在计算机科学中&#xff0c;树是一种重要的非线性数据结构&#xff0c;直观地看&#xff0c;它是数据元素&#xff08;在树中称为结点&#xff09;按分支关系组织起来的结构。二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”&#xff08;left s…

二叉树的四种遍历方法(前序遍历、中序遍历、后序遍历、层序遍历)有图有真相!!!

文章目录 二叉树的四种遍历方式前序遍历&#xff08;Preorder Traversal&#xff09;中序遍历&#xff08;Inorder Traversal&#xff09;后序遍历&#xff08;Postorder Traversal&#xff09;层序遍历&#xff08;Level Order Traversal&#xff09; 二叉树的四种遍历方式 相…

二叉树的层次遍历算法

前面学的二叉树的遍历是把二叉树看作3个部分&#xff1a;根&#xff0c;左子树&#xff0c;右子树&#xff0c;然后我们以此来访问3个部分 而层次遍历是把树看成从上到下的若干层&#xff1a;根结点在第一层&#xff0c;根结点的孩子在第二层&#xff0c;根结点的孩子的孩子在第…

二叉树各种遍历算法

二叉树是许多算法题的常用结构&#xff0c;其遍历算法的各种变种就是各种题目。具体的顺序如下&#xff1a; 先序遍历&#xff1a;先根、后左、再右中序遍历&#xff1a;先左、后根、再右后序遍历&#xff1a;先左、后右、再根 递归版先序、中序、后序遍历 最简单、最直接的…

带你图解二叉树的多种递归遍历(建议收藏!!)

文章目录 二叉树的构建结点类型的定义构建二叉树之间的关系 深度优先遍历前序遍历代码实现图解递归&#xff08;由于图片大小问题&#xff0c;建议用手机客户端查看&#xff0c;以下图解也是&#xff09; 中序遍历代码实现图解递归 后序遍历代码实现图解递归 广度优先遍历层序遍…

二叉树遍历之图解Mirror算法(莫里斯算法)

144. 二叉树的前序遍历 我们写二叉树的遍历时&#xff0c;一般有两种方式&#xff0c;迭代和递归。然而还有一种神奇的算法&#xff0c;也可以作我们的二叉树递归&#xff0c;且空间复杂度为O(1)&#xff0c;要知道&#xff0c;我们迭代和递归都是需要额外栈空间的 递归和迭代网…

二叉树遍历方法——前、中、后序遍历(图解)

目录 一、前序遍历 &#xff08;1&#xff09;递归版本 &#xff08;2&#xff09;非递归版本 二、中序遍历 &#xff08;1&#xff09;递归版本 &#xff08;2&#xff09;非递归版本 三、后序遍历 &#xff08;1&#xff09;递归版本 &#xff08;2&#xff09;非递归版…

详细图解二叉树四种遍历(前序中序后序层次遍历)

文章目录 一.前序遍历常规操作简单方法 二.中序遍历常规操作简单方法 三.后序遍历常规操作 四.层次遍历常规操作 本文中以此二叉树为例 一.前序遍历 常规操作 先根&#xff0c;再左&#xff0c;再右 确定了遍历整体结构&#xff1a; 确定了左子树中的整体结构 继续操作&…

FPN细节剖析以及pytorch代码实现

目录 FPN&#xff08;feature pyramid network&#xff09; 网络结构 bottleneck pytorch代码实现 公式&#xff1a;卷积层输入输出大小的计算公式 细节一&#xff1a;代码中blocks参数的含义 细节二&#xff1a;c1 c2 c3 c4 c5层尺寸分别为原图的1/2 1/4 1/8 1/16 1/32…

目标检测之FPN、AugFPN、NAS-FPN

针对小目标的检测有提升的文章。 未完待续~ Feature Pyramid Networks for Object Detection FPN是一种多尺度的目标检测算法。大多数目标检测算法都是采用顶层特征来做预测的&#xff0c;但是我们知道&#xff1a;低层的特征语义信息较少&#xff0c;但是位置信息丰富&#x…

FPN网络和RPN网络介绍

原文链接 神经网络特征提取过程中&#xff0c;一般底层特征具有良好的空间信息&#xff0c;高层的具有良好的语义信息。原来多数的object detection算法都是只采用顶层特征做预测&#xff0c;但我们知道低层的特征语义信息比较少&#xff0c;但是目标位置准确&#xff1b;高层…

Neck网络 FPN + PAN 改进解读

呃 这篇文章的目的在于补充一些知识以便于理解Neck部分的网络 特征提取网络 与 目标检测之间的关系 一个特征提取网络&#xff0c;假设有1000层&#xff0c;开始的特征图包含的细节信息就很多&#xff0c;而随着网络的加深&#xff0c;特征提取网络经过多次被卷积和池化操作&…

FPN论文笔记

FPN论文笔记 现在看FPN和Inception并行结构融合有点像&#xff0c;FPN上采样同时横向连接相加&#xff0c;Inception是堆叠几个感受野不同的feature&#xff0c;融合的思想有点相似。 FPN是什么&#xff1f; Feature Pyramid Networks,用于特征抽取&#xff08;feature extr…

FPN算法一览

FPN应该是2017年CV顶会的优秀论文&#xff0c;基于目标检测做的研究&#xff0c;在小物体检测方面较为具有吸引力。 1.FPN 源论文&#xff1a;feature pyramid networks for object detection 参考代码&#xff1a;FPN 同时利用低层特征高分辨率和高层特征的高语义信息&…

目标检测中的各种FPN

早期的目标检测算法&#xff0c;无论是一步式的&#xff0c;还是两步式的&#xff0c;通常都是在Backbone的最后一个stage&#xff08;特征图分辨率相同的所有卷积层归类为一个stage&#xff09;最后一层的特征图&#xff0c;直接外接检测头做目标检测。此种目标检测算法&#…

FPN(在FasterRCNN里面是如何运用的)

FPN(Feature Pyramid Networks) FPN解决了什么问题&#xff1f; 答&#xff1a;FPN的提出是为了实现更好的feature maps融合&#xff0c;一般的网络都是直接使用最后一层的feature maps&#xff0c;虽然最后一层的feature maps 语义强&#xff0c;但是位置和分辨率都比较低&…