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

国际转运网站建设今日发生的重大新闻

国际转运网站建设,今日发生的重大新闻,网站建设业务范围,华文细黑做网站有版权吗博客主页:【夜泉_ly】 本文专栏:【数据结构】 欢迎点赞👍收藏⭐关注❤️ 数据结构-链式二叉树-四种遍历 1.前言2.前、中、后序遍历2.1前序遍历2.1中、后序遍历 3.层序遍历3.1递归实现3.2队列实现关于在Pop之后为什么还能用tmp访问节点&#x…

博客主页:【夜泉_ly】
本文专栏:【数据结构】
欢迎点赞👍收藏⭐关注❤️

数据结构-链式二叉树-四种遍历

  • 1.前言
  • 2.前、中、后序遍历
    • 2.1前序遍历
    • 2.1中、后序遍历
  • 3.层序遍历
    • 3.1递归实现
    • 3.2队列实现
      • 关于在`Pop`之后为什么还能用`tmp`访问节点?
      • 关于都已经把队列`Pop`为空了为什么还要`QueueDestroy`?
  • 4.浅谈DFS与BFS

1.前言

在我之前的文章数据结构-堆-详解中,我对堆这种特殊的完全二叉树做了详细介绍。
完全二叉树非常适合用数组存储,但一般的二叉树呢?如下图所示:
在这里插入图片描述
可以发现,普通二叉树若使用数组存储,会浪费大量空间,这时,链式存储结构成为更好的选择。
在这种结构中,每个节点应包含自身所存储的数据,以及指向左右子树的指针。
可以通过以下结构体定义二叉树节点:

typedef char BTDataType;typedef struct TreeNode
{BTDataType val;struct TreeNode* left;struct TreeNode* right;
}TreeNode;

为了便于理解,我手搓了一个简单的二叉树:
在这里插入图片描述
代码如下:

TreeNode* BuyTreeNode(BTDataType x)
{TreeNode* tmp = (TreeNode*)malloc(sizeof(TreeNode));if (!tmp){perror("BuyTreeNode::malloc");return NULL;}tmp->val = x;tmp->left = NULL;tmp->right = NULL;return tmp;
}
TreeNode* CreatBinaryTree()
{TreeNode* root = BuyTreeNode('a');TreeNode* n1 = BuyTreeNode('b');TreeNode* n2 = BuyTreeNode('c');TreeNode* n3 = BuyTreeNode('d');TreeNode* n4 = BuyTreeNode('e');TreeNode* n5 = BuyTreeNode('f');TreeNode* n6 = BuyTreeNode('g');root->left = n1;root->right = n2;n1->left = n3;n1->right = n4;n2->left = n5;n2->right = n6;return root;
}

注意:这并不是二叉树真正的创建方法,等对于二叉树的结构有更深入的了解后,再讲创建。

在对二叉树进行各项操作时,应对其结构有明确的认识:
在这里插入图片描述
对任意一个二叉树,都由 根 、左子树 、右子树 组成。
左右子树,也是二叉树,也有对应的 根 、左子树 、右子树
因此,二叉树的定义是递归的,在对二叉树进行处理时也常常使用递归。
而对二叉树的递归操作也应以 根 、左子树 、右子树 为基础展开。

2.前、中、后序遍历

2.1前序遍历

二叉树的前序遍历:先访问,再遍历左子树,最后遍历右子树

void BinaryTreePrevOrder(TreeNode* root)
{if (!root){printf("NULL ");return;}printf("%c ", root->val);BinaryTreePrevOrder(root->left);BinaryTreePrevOrder(root->right);
}

先判断根,如果为空,就打印NULL并返回;
若不为空,则先打印根的值,再遍历左子树,最后遍历右子树。

在二叉树这块,可以先画画逻辑结构图:
在这里插入图片描述
虽然画的不全,但大概就是这么个意思。
如果难以理解时可以再画画递归展开图:把代码是怎么一行行执行的给画出来。
经过分析,可知打印结果应该是:a b d NULL NULL e NULL NULL c f NULL NULL g NULL NULL
在这里插入图片描述

也可以选择不打印空,结果是:a b d e c f g
在这里插入图片描述

在画过图后,应对二叉树的遍历有更清楚的认识:
在打印d后为什么直接打印e?
并非是从d的节点直接到e的节点,
而是先访问d的两个空的左右子树,d结束了左右子树的遍历,返回到b
此时b结束了它的左子树的遍历,于是开始遍历右子树,然后才到了e处。

2.1中、后序遍历

二叉树的中序遍历:先遍历左子树,再访问,最后遍历右子树

void BinaryTreeInOrder(TreeNode* root)
{if (!root){printf("NULL ");return;}BinaryTreeInOrder(root->left);printf("%c ", root->val);BinaryTreeInOrder(root->right);
}

二叉树的后序遍历:先遍历左子树,再遍历右子树,最后访问

void BinaryTreePostOrder(TreeNode* root)
{if (!root){printf("NULL ");return;}BinaryTreePostOrder(root->left);BinaryTreePostOrder(root->right);printf("%c ", root->val);
}

此时,可以写个代码测试一下:

int main()
{TreeNode* root = CreatBinaryTree();printf("BinaryTreePrevOrder:");BinaryTreePrevOrder(root);printf("\nBinaryTreeInOrder:");BinaryTreeInOrder(root);printf("\nBinaryTreePostOrder:");BinaryTreePostOrder(root);return 0;
}

运行结果:
在这里插入图片描述
也可以不打印NULL:
在这里插入图片描述

3.层序遍历

就是从上至下从左至右的遍历:
在这里插入图片描述

3.1递归实现

此实现方法并不重要,所以略讲。
先求个高度:

int TreeHeight(TreeNode* root)
{if (!root)return 0;int leftheight = TreeHeight(root->left);int rightheight = TreeHeight(root->right);return leftheight > rightheight ? 1 + leftheight : 1 + rightheight;
}

再写个打印第k层元素的函数:

void BinaryTreeLevelPrint(TreeNode* root, int level)
{if (!root)return;if (level == 1)printf("%c ", root->val);else{BinaryTreeLevelPrint(root->left, level - 1);BinaryTreeLevelPrint(root->right, level - 1);}
}

最后组合起来,即一层一层的打印:

void BinaryTreeLevelOrder(TreeNode* root)
{int level = TreeHeight(root);for (int i = 1; i < level; i++){BinaryTreeLevelPrint(root, i);}
}

测试一下:

int main()
{TreeNode* root = CreatBinaryTree();printf("BinaryTreeLevelOrder:");BinaryTreeLevelOrder(root);return 0;
}

结果:
在这里插入图片描述

3.2队列实现

二叉树层序遍历使用递归比较麻烦,且不太直观,因此,通常使用另一种方法,即队列:

  • 先将根节点入队列
    在这里插入图片描述
  • 将队首的节点出队列,并带入当前节点的两个非空子节点
    在这里插入图片描述
  • 重复
    在这里插入图片描述
  • 再重复
    在这里插入图片描述
  • 队列为空,停止
    在这里插入图片描述

其中,有关队列的函数可直接CV --> 数据结构-栈、队列-详解。

需注意的是,存入队列的是指向节点的指针,因此,需改变一下队列存储的数据类型:

//typedef int QDatatype;
typedef TreeNode* QDatatype;

代码实现:

void BinaryTreeLevelOrder(TreeNode* root)
{Queue q;QueueInit(&q);if (!root);QueuePush(&q, root);while (!QueueEmpty(&q)){TreeNode* tmp = QueueFront(&q);QueuePop(&q);printf("%c ", tmp->val);if (tmp->left)QueuePush(&q, tmp->left);if (tmp->right)QueuePush(&q, tmp->right);}printf("\n");QueueDestroy(&q);
}

常见疑问解答:

关于在Pop之后为什么还能用tmp访问节点?

在这里插入图片描述
因为,Pop的是队列的节点,tmp为局部变量,保存了队首元素的值,作为指针,指向树中的节点。
因此,在Pop之后还能用tmp访问节点。

关于都已经把队列Pop为空了为什么还要QueueDestroy

我所写的队列是不带哨兵位头结点的,所以把队列Pop空了后,用不用QueueDestroy都无所谓,但如果其他人写的队列带了哨兵位头结点,不Destroy就会造成内存泄漏。

这里有个词叫耦合,还有个词叫解耦
耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。
解耦就是用数学方法将两种运动分离开来处理问题,常用解耦方法就是忽略或简化对所研究问题影响较小的一种运动,只分析主要的运动。

在使用队列时,不管是怎样操作的,在最后都加上QueueDestroy,这也算是一种解耦,因为这样,无论队列是如何实现的,无论实现者用的数组还是链表、单链还是双链、带不带哨兵位的头结点,都可以避免问题的产生。

4.浅谈DFS与BFS

DFS:即Depth First Search,深度优先搜索。
二叉树的DFS就是前序遍历,放宽一点就是前、中、后序遍历。
特点是一条路走到底,再返回并走其他的路。多用递归实现。

BFS:即Breadth First Search,广度优先搜索。
二叉树的BFS就是层序遍历。
特点是一点点扩大搜索范围,类似于地毯式搜索。多用队列实现。


希望本篇文章对你有所帮助!并激发你进一步探索数据结构的兴趣!

本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!


文章转载自:
http://vaticanology.bbmx.cn
http://radiocarbon.bbmx.cn
http://taxogen.bbmx.cn
http://unadvantageous.bbmx.cn
http://reasonedly.bbmx.cn
http://sequestered.bbmx.cn
http://neurologist.bbmx.cn
http://shut.bbmx.cn
http://bistable.bbmx.cn
http://decinormal.bbmx.cn
http://sabretache.bbmx.cn
http://asshur.bbmx.cn
http://unfermentable.bbmx.cn
http://virtue.bbmx.cn
http://affectively.bbmx.cn
http://robotology.bbmx.cn
http://corporator.bbmx.cn
http://despumation.bbmx.cn
http://anelectric.bbmx.cn
http://coryza.bbmx.cn
http://zeiss.bbmx.cn
http://intermezzo.bbmx.cn
http://covariant.bbmx.cn
http://prone.bbmx.cn
http://roundness.bbmx.cn
http://stickle.bbmx.cn
http://charbon.bbmx.cn
http://fairily.bbmx.cn
http://deploy.bbmx.cn
http://piteous.bbmx.cn
http://spike.bbmx.cn
http://sedateness.bbmx.cn
http://subhedral.bbmx.cn
http://strobic.bbmx.cn
http://instauration.bbmx.cn
http://synthetical.bbmx.cn
http://raschel.bbmx.cn
http://nonmetallic.bbmx.cn
http://fogging.bbmx.cn
http://obscurantic.bbmx.cn
http://hoopster.bbmx.cn
http://lmbc.bbmx.cn
http://cowheel.bbmx.cn
http://jellied.bbmx.cn
http://absurdity.bbmx.cn
http://ritz.bbmx.cn
http://esperance.bbmx.cn
http://epilation.bbmx.cn
http://alod.bbmx.cn
http://predictability.bbmx.cn
http://mandrill.bbmx.cn
http://hydroformate.bbmx.cn
http://coleopterist.bbmx.cn
http://karatsu.bbmx.cn
http://anthema.bbmx.cn
http://sodwork.bbmx.cn
http://eternise.bbmx.cn
http://freehearted.bbmx.cn
http://cambric.bbmx.cn
http://killtime.bbmx.cn
http://proponent.bbmx.cn
http://earache.bbmx.cn
http://asianic.bbmx.cn
http://spaceport.bbmx.cn
http://shitticism.bbmx.cn
http://ululance.bbmx.cn
http://solubility.bbmx.cn
http://africander.bbmx.cn
http://physiolatry.bbmx.cn
http://sheet.bbmx.cn
http://azul.bbmx.cn
http://lexicon.bbmx.cn
http://disregard.bbmx.cn
http://sonation.bbmx.cn
http://benignant.bbmx.cn
http://decorate.bbmx.cn
http://endoerythrocytic.bbmx.cn
http://feracious.bbmx.cn
http://choric.bbmx.cn
http://thermidor.bbmx.cn
http://the.bbmx.cn
http://discernible.bbmx.cn
http://impregnability.bbmx.cn
http://thrilling.bbmx.cn
http://blowdown.bbmx.cn
http://barkhan.bbmx.cn
http://adopted.bbmx.cn
http://delightsome.bbmx.cn
http://secretion.bbmx.cn
http://caliban.bbmx.cn
http://tunney.bbmx.cn
http://crawly.bbmx.cn
http://allometric.bbmx.cn
http://elegise.bbmx.cn
http://drainer.bbmx.cn
http://speech.bbmx.cn
http://polycarbonate.bbmx.cn
http://nightstand.bbmx.cn
http://coking.bbmx.cn
http://crawl.bbmx.cn
http://www.15wanjia.com/news/84546.html

相关文章:

  • wordpress 3.9 for saesem和seo有什么区别
  • css div网站模板下载潮州seo建站
  • 找程序员的网站备案查询站长之家
  • 直接买个域名就能自己做网站国外搜索引擎排名
  • 想给公司产品做个推广seo新人培训班
  • seo建网站网络优化工程师前景如何
  • 顺德网站建设jinqiye全球访问量top100网站
  • 深圳市社会建设局网站淘宝店铺怎么引流推广
  • 文化馆网站建设的意义google下载安卓版下载
  • 织梦网站首页模板路径百度人工电话多少号
  • 建筑公司加盟开分公司三门峡网站seo
  • 字形分析网站免费行情软件网站大全
  • 网站首页动画代码个人怎么创建网站
  • 淄博桓台网站建设定制网络营销收获与体会
  • 网站插件代码大全舆情监测系统排名
  • seo网站优化插件网红营销
  • wordpress仿b站济南seo优化外包服务公司
  • 企业网站建设ppt模板生哥seo博客
  • 电子商务网站开发问题研究免费推广seo
  • 深圳设计公司vi设计模板网站seo怎么操作
  • 社交app开发公司泽成seo网站排名
  • 珠海专业做网站制作中国网络优化公司排名
  • 高端网站设计多少钱百度商家平台客服电话
  • 网站设计理念深圳知名网络优化公司
  • 软件开发者路线图牛排seo
  • 公司网站怎么做优化seo概念的理解
  • 政府网站建设及信息公开连云港seo公司
  • 小程序定制一般多少钱成都优化官网公司
  • 网站开发管理工具有哪些西安百度提升优化
  • 做海报推荐网站河北seo