数据结构与算法学习笔记 (10)--二叉树的创建与遍历

举报
王建峰 发表于 2021/11/19 02:17:05 2021/11/19
【摘要】 一、背景介绍 二叉树结构有根结点-左子树-右子树组成,每个子树又可分成根结点-左子树-右子树...... 这说明二叉树具有递归性质,利用递归的思想实现二叉树的创建与遍历。   二、递归思想创建/遍历二叉树 先左(子树)后右(子树)的顺序创建二叉树 void create_btree(btree_pnode ...

一、背景介绍

二叉树结构有根结点-左子树-右子树组成,每个子树又可分成根结点-左子树-右子树......

这说明二叉树具有递归性质,利用递归的思想实现二叉树的创建与遍历。

 

二、递归思想创建/遍历二叉树

先左(子树)后右(子树)的顺序创建二叉树


  
  1. void create_btree(btree_pnode *T)
  2. {
  3. datatype_bt ch;
  4. //如果结点不存在,则输入时,用#表示
  5. scanf("%c",&ch);
  6. if('#' == ch)
  7. *T = NULL;
  8. else{
  9. //创建根结点
  10. *T = (btree_pnode)malloc(sizeof(btree_node));
  11. if(NULL == *T){
  12. perror("malloc");
  13. exit(1);
  14. }
  15. (*T)->data = ch;
  16. //创建左子树
  17. create_btree(&(*T)->lchild);
  18. //创建右子树
  19. create_btree(&(*T)->rchild);
  20. }
  21. }

 

 

先左后右的遍历,先序遍历结点(第一次遍历结点输出)

A B C D E F G H K


  
  1. void pre_order(btree_pnode t)
  2. {
  3. if(t != NULL){
  4. //访问根结点
  5. printf("%c",t->data);
  6. //先序遍历左子树
  7. pre_order(t->lchild);
  8. //先序遍历右子树
  9. pre_order(t->rchild);
  10. }
  11. }


先左后右的遍历,中序遍历结点(第二次遍历结点输出)

B D C A E H G K F


  
  1. void mid_order(btree_pnode t)
  2. {
  3. if(t != NULL){
  4. //中序遍历左子树
  5. mid_order(t->lchild);
  6. //访问根结点
  7. printf("%c",t->data);
  8. //中序遍历右子树
  9. mid_order(t->rchild);
  10. }
  11. }


先左后右的遍历,后序遍历结点(第三次遍历结点输出)

D C B H K G F E A


  
  1. void post_order(btree_pnode t)
  2. {
  3. if(t != NULL){
  4. //后序遍历左子树
  5. post_order(t->lchild);
  6. //后序遍历右子树
  7. post_order(t->rchild);
  8. //访问根结点
  9. printf("%c",t->data);
  10. }
  11. }

 

二、按层遍历

G H K

按照从左向右的顺序遍历一层的结点,同时将这个结点的左右子结点存放到队列中,以便下一层的遍历。

算法思路:先遍历一层根结点,将根结点下的左右子结点(若存在)入队。第二层的结点出队,遍历结点同时将结点的左右子节点入队。第二层结点遍历完成,说明此时第三层的结点元素已经存在队列中,开始第三层结点的遍历......直到队列为空!


  
  1. void level_order(btree_pnode t)
  2. {
  3. link_pqueue q;
  4. init_linkqueueu(&q); //初始化链式队列
  5. while(t != NULL){
  6. printf("%c",t->data);
  7. if(t->lchild != NULL)
  8. in_linkqueue(t->lchild,q);
  9. if(t->rchild != NULL)
  10. in_linkqueue(t->rchild,q);
  11. if(is_empty_linkqueue(q))
  12. break;
  13. else
  14. out_linkqueue(&t,q);
  15. }
  16. }

 

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/81174245

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。