首页 > 其他分享 >数据结构——链式二叉树(C语言版)

数据结构——链式二叉树(C语言版)

时间:2024-07-27 23:24:50浏览次数:10  
标签:左子 遍历 递归 右子 C语言 二叉树 数据结构 节点

链式二叉树的结构

⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。 通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。                                  由上图可见,链式二叉树的每个节点存有三个变量,第一个为节点存的数据,第二个与第三个分别为指向左孩子指针与指向右孩子指针。

创建链式二叉树

        由于普通的二叉树并没有插入删除的意义,所以在创建二叉树时只需要手动创建二叉树就行,因为普通二叉树没有条件限制比如:

所以在普通二叉树里并没有增删的意义,创建时只需要手动创建即可。

        创建二叉树的第一步:先写一个创建单个节点的函数,并将节点里左右指针都初始化为NULL,这样也方便后续链接操作。 第二步:手动申请7个节点,并将将节点之间进行链接。最终形成以下的逻辑图片。

        因为根结点的左⼦树和右⼦树分别⼜是由⼦树结点、⼦树结点的左⼦树、⼦树结点的右⼦树组成的,因此⼆叉树定义是递归式的,

链式二叉树的遍历

        前序遍历:

前序遍历(Preorder Traversal 亦称先序遍历):访问根结点的操作发⽣在遍历其左右⼦树之前,及访问顺序为:根,左子树,右子树。就以上图为例子                          第一步:先判断此时的根是否为NULL,如果是就输出NULL后返回,第二步:先输出根节点的值,接着在递归根的左子树,第三步:将根的左子树递归完后接着递归右子树。                                                   左子树展开图         以上是根节点的左子树的展开图:一开始会先节点是否为空,接着输出根节点数值,接着递根的左子树,当左子树为空的时候就开始递根的右子树,右子树又开始递 根,左子树,右子树,当左右子树都为NULL时候开始归。 当左子树归完后根节点开始递根节点的右子树。                                                   右子树展开图 最终递归的输出顺序为:

        中序遍历:

        中序遍历(Inorder Traversal):访问根结点的操作发⽣在遍历其左右⼦树之中(间)及访问顺序为:左子树,根,右子树。                                                                                            左子树展开图         根据顺序,从根开始并没有先输出值而是先开始递归根的左子树,从上图的左子树的递归展开图中,当节点递到3的左子树(NULL)时,先输出NULL接着开始归,重新归到3节点时输出3,接着递归3的右子树(7),并重复步骤,当1的左子树递归完后就输出1节点的值并执行递归1的右子树。                                                   右子树展开图         
        当递归1的右子树(4)时,4又作为根开始递归4的左子树与右子树,但遇到NULL节点时就开始进行返回。         最终中序遍历完成会输出:

        后序遍历:

        后序遍历(Postorder Traversal):访问根结点的操作发⽣在遍历其左右⼦树之后 ,及访问顺序为:左子树,右子树,根。                                                                  左子树展开图                                                                    右子树展开图         从后续展开图中可以看出,二叉树的后序遍历,是优先访问根节点的左子树与右子树,将根节点的左右子树访问完最后再访问根节点的值,最终输出的顺序为:         二叉树的前中后序其实访问的顺序是一样的,只是在于访问根节点数据的时机不同,产生的结果也不同。

        层序遍历:

除了二叉树的先序遍历、中序遍历、后序遍历外,还可以对⼆叉树进⾏层序遍历。设⼆叉树的根结点所在层数为1,层序遍历就是从所在⼆叉树的根结点出发,⾸先访问第⼀层的树根结点,然后从左到右访问第2 上的结点,接着是第三层的结点,以此类推,⾃上⽽下,⾃左⾄右逐层访问树的结点的过程就是层序遍历。         从上图可以看出,通过队列的特性,先进先出,先将根节点入队,入队后出队,并在出队的时候同时将根的左右子树入队,当节点为NULL则不入队,当队列重新为空时,则结束循环,并打印出二叉树的层序遍历形式。

链式二叉树的简单算法题

        求二叉树所有节点个数:

                                                左子树展开图

                                        右子树展开图

从上图的左右子树展开图图可以看出,求节点根数需要分别递归计算根的左子树与右子树,当递归到NULL时返回0,当左右子树递归完后需要再加上1(自身),再进行返回。最终计算出该子树节点数量为7。

        求二叉树叶子节点的个数:

                                        递归展开图

        因为叶子节点的特点是左右子树都为NULL,利用这一特性,当递到根的左右子树都为NULL,就返回1表示这个节点是叶子节点。如果左节点或又节点其中一个是NULL并不会返回1,而是继续递归。当递归到叶子节点时直接返回一。最终得得出根的左子树节点数与根的右子树节点数。

        求二叉树第k层的节点个数:

                                               

                                                        递归展开图

        由上图的展开图可以看出,假设k==3,分别递归根的左子树与右子树的第k层,每一次递归的时候都让k-1,当k==1的时候就说明已经到了第k层直接返回1,当递归到第k-1层的时,只需要判断k-1层的左节点与右节点,如果为NULL就返回0,最后将k层返回的数字进行相加并return就得到第k层节点数。

        求二叉树的深度:

                                        左子树深度展开图

                                右子树深度展开图        

        想要计算二叉树的深度,就要计算根的左子树与右子树的深度,将左子树的深度与右子树的深度进行比较,并返回较大值,如上图,通过递归展开,会得知左子树的深度为3,右子树的深度为2,最终返回左子树的深度+1,所以上图二叉树的深度为4。

        二叉树查找值为x的节点:

                                递归展开图

        由上图可见,当需要找x节点时,一开始会先判断根节点是否符合条件,如果符合条件直接返回,如果不符合就先递归根的左子树,当左子树递归完后发现并没有找到值会返回NULL,此时指针为NULL,会递归根的右子树,当发现有节点符合值的时候会直接返回并给指针赋值,防止继续递归。

标签:左子,遍历,递归,右子,C语言,二叉树,数据结构,节点
From: https://blog.csdn.net/2301_80894970/article/details/140718576

相关文章

  • 学习c语言第十五天(初阶测评)
    选择题1.下列程序输出结果为672.下列程序输出结果为 死循环打印3.i和j的值分别为什么 214.k的终值是什么905.输出结果是什么 16.正确的是    C7.C语言规定main函数位置    C8.不正确的是    D9.正确的是     c ......
  • C语言初阶(6)
    1.函数递归定义程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可......
  • CTF-PWN 堆的相关数据结构
    文章连接: 《堆的相关数据结构》参考:1.ctf.wiki:堆相关数据结构-CTFWiki2.星盟pwn佬:0011.哔哩哔哩-【个人向】CTFpwn入门-P11[高清版]_哔哩哔哩_bilibilimalloc_chunk概念:通过malloc申请的内存称为chunk,也可以将chunk称作堆的一个单位(自己随意理解)。free......
  • (leetcode学习)236. 二叉树的最近公共祖先
    给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”示例1:输入:root=[3,5,1,6,2,0,8,nul......
  • 15.C语言形式参数和实际参数的介绍及函数总结
    形参和实参的介绍及函数总结1.形式参数和实际参数2.获取两个最大的数3.关于函数的一些总结1.形式参数和实际参数实际参数可以是常量、变量、表达式y=get(1);//常量y=get(x);//变量y=get(x+1);//表达式形参和实参数值相同,地址不同(传递参数是数值的传递......
  • 数据结构—红黑树
    红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质每个结点不是红色就......
  • C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
    写在最前,一篇文章学会C语言指针顶级重要,学习C语言最重要的一部分-------指针第八章指针超详细讲解_指针变量_二维数组指针_指向字符串指针文章目录写在最前,一篇文章学会C语言指针第八章指针超详细讲解_指针变量_二维数组指针_指向字符串指针1.指针变量1.1指针变......
  • C语言的函数递归
    一、递归的意义所谓函数递归,就是在某个函数中再次调用这个函数本身,做到函数自己调用自己,这个就是函数的递归。而函数的递归主要是的作用是将一个本身比较复杂,并且步骤繁多的函数逐次的递归使其变得简单化,就比如剥笋:我们想要得到里面能吃的部分,就需要剥笋。而笋的皮有很多层,每......
  • Python 教程(二):语法与数据结构
    目录前言专栏列表语法特点实例代码基本数据类型变量命名规则赋值动态类型作用域示例代码运算符`list`、`set`和`dict`数据结构区别1.list(列表)2.set(集合)3.dict(字典)总结前言Python是一种计算机编程语言。每种编程语言都有自己的语法规则。在本教程中,我们将学......
  • 数据结构-二叉树(顺序结构)
    引言顺序结构存储就是使⽤数组来存储,⼀般只适合表⽰完全⼆叉树,因为不是完全⼆叉树会有空间的浪费,完全⼆叉树更适合使⽤顺序结构存储。一、堆的概念将一个元素集合k里,所有数据按照完成二叉树的顺序存储方式存储。并且数组中的元素,满足以下关系i=0、1、2...,则称为......