当前位置: 首页 > news >正文

网站建设地址北京昌平网站开发和大数据开发区别

网站建设地址北京昌平,网站开发和大数据开发区别,国家住房和城乡建设部中国建造师网站官网,如何为旅游网站店铺做推广营销📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

📙作者简介: 清水加冰,目前大二在读,正在学习C/C++、Python、操作系统、数据库等。

📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。

欢迎点赞 👍 收藏 ⭐留言 📝 如有错误还望各路大佬指正!

✨每一次努力都是一种收获,每一次坚持都是一种成长✨       

在这里插入图片描述

目录

 前言

1. 二叉树的链式结构

   1.1链式二叉树的结构

2. 二叉树初阶训练

 2.1 二叉树节点个数

 2.2 叶子节点个数

 2.3 第k层节点个数

总结


 前言

        前边我主要介绍了二叉树的顺序结构,链式结构也只是简单提及,今天我们来详细介绍一下二叉树的链式结构。


1. 二叉树的链式结构

        二叉树的顺序结构是通过顺序表来存储二叉树的数据,那么链式结构就是通过链表,连接二叉树的各个节点,进而来实现二叉树的树形结构。链式二叉树存储不需要像堆那要必须是完全二叉树,它可以是一颗普通二叉树。 

   1.1链式二叉树的结构

        二叉树的链式结构是指使用节点之间的指针连接来表示二叉树的结构。在链式结构中,每个节点都包含一个数据元素和指向其左子节点和右子节点的指针。一个二叉树的节点通常由两个部分组成:数据域和指针域。

typedef struct BinaryTree
{int data;//数据域struct BinaryTree* left;//指针域struct BinaryTree* right;//指针域
}BTNode;

         通过这种链式结构,我们可以方便地遍历和操作二叉树。最常见的遍历方法就是使用递归遍历二叉树。前边我们也简单介绍了二叉树的前序、中序、后续遍历。也很简单,但是在实际中,并不会这么直白的让你递归遍历二叉树,都是遍历的变形。

2. 二叉树初阶训练

 2.1 二叉树节点个数

   如何计算一个二叉树的节点个数呢?

  链式结构的树使用递归来遍历最简单,也是最常用的遍历方法。这样写吗?

int TreeSize(BTNode* root)
{int size = 0;if (root == NULL)return 0;else++size;TreeSize(root->left);TreeSize(root->right);return size;
}

         节点是NULL就返回0,不为空就size++。看似没有问题,但深入思考一下就会发现端倪,每次递归都会重新创建一个size然后++,每次的size都加到了一个size上吗?其实并没有,size出了函数作用域就会销毁,递归到叶子节点返回后,前边的size就会被销毁。

         只要解决size作用域问题是不是就可以解决了?增加size的生命周期有两种方法,一个是使用全局变量,另一个是使用static修饰。这样虽然可以计算出二叉树的节点个数,但这样也存在缺点,这个函数的使用就会变成一次性的,如果在一个程序中多次调用,数据就会累计(如第一次是5,第二次就是10……),也有解决的办法就是每次使用前将size置为0。但这都不是这个问题的最优解,最优解就是使用递归解决。

        递归的核心就是分治,将一个复杂的过程分解成一个一个的类似子问题。要计算一颗二叉树的节点个数就只需要计算左子树节点个数+右子树节点个数+1。左子树又可以分为左子树右子树,直到叶子节点,叶子节点的左右子树为NULL,所以遇到NULL就返回0;那我们就可以这样写:

int TreeSize(BTNode* root)
{if (root == NULL)return 0;return TreeSize(root->left) + TreeSize(root->right) + 1;
}

 如下图:

         虚线代表的递归返回,返回节点的个数。这里也仅仅是一个简单的递归,有了这个题目的思路,我们来进阶一下。

 2.2 叶子节点个数

        计算叶子节点个数也是使用递归,对这个问题进行分治,计算一棵树的叶子节点个数,也就是左子树和右子树中叶子节点的个数,子树又可以再分为左子树、右子树。遇到叶子节点就停止。使用递归可以大幅的减少代码的复杂度。现在就只需考虑一下递归停止的条件。叶子节点的左子树与右子树都为空,所有当根的左右子树都为NULL时就可以判定为叶子节点。

int BinaryTreeLeafSize(BTNode* root)
{if (root==NULL){return 0;}if (root->left == NULL && root->right == NULL){return 1;}return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

  例如这棵树,有三个叶子节点:

         当前节点为NULL就不是叶子节点返回0,如果左右子树都为NULL,则该节点就是叶子节点,返回1,最后将左子树和右子树的叶子节点个数相加,最终返回值就是叶子节点的个数。

 2.3 第k层节点个数

         在前两个的基础上我们再来一个变形,计算第k层节点个数。这道题目不像前两个那要,它需要有控制一下递归的深度。

int BinaryTreeLevelKSize(BTNode* root, int k)

        传入一个k,和根节点,通过k来控制递归的深度。这里我们默认根节点的高度是1。如果遇到NULL就返回0;

int BinaryTreeLevelKSize(BTNode* root, int k)
{assert(k > 0);if (root == NULL){return 0;}if (k == 1){return 1;}return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);    
}

例如这棵树:

         假设我们要计算第3层节点个数。第一次调用从根开始,k此时等于3,然后开始向下递归第二次调用,传参是k-1,到第二层时k=2,到第三层时,k=1。这里我们需要注意一下两个判断返回的顺序,要先判断当前节点是否为NULL,不为NULL才开始判断k是否为1。


总结

         本篇文章主要简单介绍了一下二叉树的链式结构,以及链式结构遍历的特点,通过一些简单的练习帮助大家更快上手二叉树的链式递归。理解并使用好递归的分治,对于后续的学习至关重要,希望这篇文章可以帮到您。最后,感谢阅读!

http://www.yayakq.cn/news/848630/

相关文章:

  • 网站建设全部流程网站ui设计用什么软件做
  • 江苏连云港做网站宜都网站建设
  • 湛江建设厅网站触摸终端软件门户网站
  • 做盗版网站吗东莞建外贸企业网站
  • 郑州网站设计网站海宁网站建设公司推荐
  • 合肥网站建设哪家好价格可以直接进网站正能量小米
  • 主机做网站服务器怎么设置wordpress 5 开发
  • 比较有设计感的网站帮忙制作网页的公司
  • 为什么要建设公司网站厚街东莞网站建设
  • seo怎么判断网站的好坏网店装修时如何进行文案策划
  • 常州云之家网站建设公司怎么样如何搜索asp网站
  • 做公司网站可以抄别人的吗全球外贸采购网
  • 不会写程序如何做网站wordpress标题换行显示不全
  • 网站建设方案书 doc建设网站有几种渠道
  • 网站建设哪里天津软件设计公司
  • ssh框架做的家政服务网站宁夏建设厅招标网站
  • 精通网站建设 全能建站密码pdf用asp做网站的流程
  • 智鼎互联网站建设网站建设考虑的因素
  • 免费网站模板带后台下载百度seo流量
  • 查网站是否备案全国信用企业信息公示系统查询
  • 品牌商城系统网站系统优化
  • 网站的访问量怎么查义乌建设网站制作
  • 心得体会万能模板wordpress主题 seo
  • 中山网站制作方案googleplay官方下载
  • 北京麒麟网站建设在线制作表白网页浪漫
  • 怎么优化网站性能浙江省住房和城乡建设厅官网
  • 优秀网站展示营销网站都有哪些
  • 做网站广告推广平台网站建设需要版块
  • 已备案网站增加域名建筑人才网有哪些
  • 企业网站设计需要多久软件工程专业就业前景