c语言二叉树的实现,c语言实现二叉树的基本操作

kodinid 3 0

大家好,今天小编关注到一个比较意思的话题,就是关于c语言二叉树的的问题,于是小编就整理了4个相关介绍c语言二叉树的实现的解答,让我们一起看看吧。

  1. 顺序存储的二叉树是如何创建和遍历的?
  2. 怎么由先序和中序来找二叉树?
  3. 分别写出二叉树的先序,中序,后序遍历序列?
  4. C++: 某二叉树的中序序列为ABCDEFG?

顺序存储的二叉树是如何创建遍历的?

说一下创建,因为底层存储一般选择数组和链表,所以对二叉树有一定的要求,存储完全二叉树选择数组存储,比较节省空间,而且通过下标可以快速访问元素;非完全二叉树使用数组存储会有很多空洞,可以选择链表,用指针指向左右节点

对于一棵完全二叉树,为了便于计算记忆,我们需要申请一个内存空间是树的元素数量+1的内存地址,比如需要建一个10个元素的树,则需要申请11个长度的内存空间。将树的根节点存储在下标为1的位置,浪费下标为0的位置,便于寻找时少做一次算数运算

c语言二叉树的实现,c语言实现二叉树的基本操作-第1张图片-安济编程网
图片来源网络,侵删)

因此,数组下标为1的位置存储根节点,推断就是对于下标 i,下标 2*i 的位置存储左子节点,下标 2*i + 1 存储右子节点,i/2 存储父节点。

借王争老师的图,比如完全二叉树

存储过程就是下标为1的位置存储根节点A,那根据公式 2*i = 2*1 = 2 的位置存储左子节点B,2*i + 1 = 2*1 +1 = 3 的位置存储右子节点C,根据下标依次推断即可。遍历的话就简单了,只需要知道根节点位置,而根节点一般选择下标1,都是明确的位置。

c语言二叉树的实现,c语言实现二叉树的基本操作-第2张图片-安济编程网
(图片来源网络,侵删)

一、首先,简单介绍一下什么是“二叉树”

二叉树是n个结点的有限集合,它的定义具有递归性:

(1)当n=0时,为空树;

c语言二叉树的实现,c语言实现二叉树的基本操作-第3张图片-安济编程网
(图片来源网络,侵删)

(2)当n=1时,只有一个结点,该节点称为根结点;

(3)当n>1时,除了根结点外的其他节点可分为互不相交的两个子集,称为左右子树,且左右子树本质上也都是二叉树。


图1 二叉树

根据二叉树的结构和定义,可总结出二叉树的特点

(1)非空二叉树的第i层最多有2∧(i-1)个结点;

(2)深度为k的二叉树最多有2∧k-1个结点

二叉树是非线性的结构,其每个结点最多有一个“前驱”,但可以有多个“后继”。它可以***用顺序存储结构链式存储结构

怎么由先序和中序来找二叉树?

遍历顺序中,先序是中左右,中序是左中右,所以方法就是通过先序找到根节点(根节点必然存在,且必为子树遍历的第一个节点),然后通过中序里面相应根节点的位置来区分左右子树,左边为其左子树,右边必为其右子树。

例如A是根,那么中序看,左子树是DFEGB,右子树是CIKJH,之后就利用递归的思路,单拿出左子树来分析;DFEGB在先序中B打头所以B是根节点,那么从中序可知,这个树只有左子树DFEG;D为根,只有右子树FEG;E为根,左叶子是F,右叶子是G。

再看CIKJH,由先序知C为根,由中序知只有右子树IKJH,再观察先序H为根,中序则只有左子树IKJ,这个树的根为I,只有右子树KJ,J为根,K为它的左叶子,全部分析完毕。

分别写出二叉树的先序,中序,后序遍历序列

前序的顺序: 根 -> 左 -> 右 中序的顺序: 左 -> 根 -> 右 后序的顺序: 左 -> 右 -> 根 先序:A,B,D,F,J,G,K,C,E,H,I,L,M 中序:J,F,D,K,G,B,A,H,E,L,I,M,C 后序:J,F,K,G,D,B,H,L,M,I,E,C,A

C++: 某二叉树的中序序列为ABCDEFG?

E / \ A G \ \ C F / \ B D后序最后一个是E,很明显E就是根根据中序分成两叉,ABCD和FG根据中序和后序,A肯定是左子树的根,并且A没有左子树接下来就简单了

到此,以上就是小编对于c语言二叉树的实现的问题就介绍到这了,希望介绍关于c语言二叉树的实现的4点解答对大家有用。

标签: 子树 节点 下标