C语言实现二叉树的各种遍历及求解深度
一、介绍
      二叉树是一种重要的数据结构,在很多方面都有重要的应用,此文主要记录了二叉树的基础知识,包括二叉树的建立、前中后序遍历方式、层次遍历方式、求解二叉树的深度、求解二叉树的节点总数、求解二叉树每层的节点数目等。(更好的阅读体验,请移步我的个人博客)
二、实现思路
主要借助栈和队列方式实现二叉树的非递归访问等操作,二叉树的建立采用递归方式。层次遍历时,借助队列数据结构,将根节点入队,当队列不为空时,退出队列的一个节点,判断此节点是否有左孩子,如有则访问,并将此孩子入队列,然后判断此节点是否有右孩子,如有则访问,并将有孩子入队列;重复此过程即可。
三、实现代码
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef char dataType;
//二叉树结构
typedef struct bnode{dataType data;struct bnode *lChild,*rChild;
}Bnode,*BTree;
//队列结构
typedef struct {BTree data[MAXSIZE];int front,rear;
}SeqQueue,*PSeqQueue;
//栈的结构
typedef struct {BTree data[MAXSIZE];int top;
}SeqStack,*PSeqStack;//队列的初始化
PSeqQueue initSeqQueue(){PSeqQueue  queue;queue = (PSeqQueue)malloc(sizeof(SeqQueue));if(queue){queue->front = queue->rear = 0;}return queue;
}
//判断队列是否为空
int emptyQueue(PSeqQueue queue){if(queue && queue->front==queue->rear){return 1;}else{return 0;}
}
//入队列
int pushQueue(PSeqQueue queue,Bnode *node){if((queue->rear+1)%MAXSIZE == queue->front){//判断队列是否满了return -1;}else{queue->rear = (queue->rear+1)%MAXSIZE;//位置为0的地址空间不用,方便判断是否为空queue->data[queue->rear] = node;return 1;}
}
//出队列
int popQueue(PSeqQueue queue,BTree *node){if(emptyQueue(queue)){return -1;}else{queue->front = (queue->front +1)%MAXSIZE;*node = queue->data[queue->front];return 1;}
}
//读取队头元素
int frontQueue(PSeqQueue queue,BTree *node){if(queue->rear == queue->front){return -1;}else{*node = queue->data[(queue->front+1)%MAXSIZE];return 1;}
}
//销毁队列
void destroyQueue(PSeqQueue *queue){if(*queue){free(*queue);*queue = NULL;}
}
//栈的初始化
PSeqStack initStack(){PSeqStack stack;stack = (PSeqStack)malloc(sizeof(SeqStack));if(stack){stack->top = -1;}return stack;
}
//判断栈是否为空    1,空;0,非空
int emptyStack(PSeqStack stack){if(stack->top == -1){return 1;}else{return 0;}
}
//入栈
int pushStack(PSeqStack stack,Bnode *node){if(stack->top == MAXSIZE-1){return 0;}else{stack->top ++;stack->data[stack->top] = node;return 1;}
}
//出栈
int popStack(PSeqStack stack,BTree *node){if(emptyStack(stack) == 1){return 0;}else{*node = stack->data[stack->top];stack->top --;return 1;}
}
//打印元素
void visit(char ch){printf("%c \t",ch);
}//二叉树的建立
BTree createTree(){BTree tree;dataType str;str = getchar();if(str == '#'){tree = NULL;}else{tree = (BTree)malloc(sizeof(Bnode));tree->data = str;tree->lChild = createTree();tree->rChild = createTree();}return tree;
}
//先序遍历二叉树
void perOrder(BTree tree){PSeqStack stack;BTree p = tree;stack = initStack();while(p || ! emptyStack(stack)){if(p){visit(p->data);pushStack(stack,p);p = p->lChild;}else{popStack(stack,&p);p = p->rChild;}}
}
//中序遍历此二叉树
void inOrder(BTree tree){PSeqStack stack;BTree p = tree;stack = initStack();while(p || !emptyStack(stack)){if(p){pushStack(stack,p);p = p->lChild;}else{popStack(stack,&p);visit(p->data);p = p->rChild;}}
}//后序遍历打印元素
void postOrder(BTree tree){PSeqStack s1,s2;BTree p = tree;s1 = initStack();s2 = initStack();while(p || !emptyStack(s2)){if(p){pushStack(s1,p);pushStack(s2,p);p = p->rChild;}else{popStack(s2,&p);p = p->lChild;}}while(!emptyStack(s1)){popStack(s1,&p);visit(p->data);}
}
//层次遍历二叉树
void levelOrder(BTree tree ){BTree p = tree;PSeqQueue queue = initSeqQueue();if(p){pushQueue(queue,p);while(!emptyQueue(queue)){popQueue(queue,&p);visit(p->data);if(p->lChild){pushQueue(queue,p->lChild);}if(p->rChild){pushQueue(queue,p->rChild);}}}
}
//求二叉树的高度
int height(BTree tree){int h1,h2;if(tree == NULL){return 0;}else{h1 = height(tree->lChild);h2 = height(tree->rChild);if(h1>h2){return h1+1;}else{return h2+1;}}
}
//求解二叉树每层节点的个数
void levelCount(BTree tree,int l,int num[]){if(tree){num[l]++;levelCount(tree->lChild,l+1,num);levelCount(tree->rChild,l+1,num);}
}
//求解二叉树节点总数
int countTree(BTree tree){int lCount,rCount;if(tree == NULL){return 0;}lCount = countTree(tree->lChild);rCount = countTree(tree->rChild);return lCount + rCount +1;
}int main(){BTree tree = createTree();int i=0;int countNum[10]={0,0,0,0,0,0,0,0,0,0},l=1,treeHeight,treeCount;//记录每层的节点数,l从1开始,树的深度treeHeight = height(tree);printf("\n此二叉树的深度为: %d\n",treeHeight);treeCount = countTree(tree);printf("此二叉树的节点总数为: %d\n",treeCount);levelCount(tree,l,countNum);printf("此二叉树各层的节点数为: ");for(i=1;i<=treeHeight;i++){printf("第%d层数目: %d,  ",i,countNum[i]);}printf("\n\n");printf("先序遍历此二叉树: ");perOrder(tree);printf("\n");printf("中序遍历此二叉树: ");inOrder(tree);printf("\n");printf("后序遍历此二叉树: ");postOrder(tree);printf("\n");printf("层次遍历此二叉树: ");levelOrder(tree);printf("\n");return 0;
}

四、实验结果截图


 

C语言实现二叉树的各种遍历及求解深度相关推荐

  1. 先根遍历二叉树c语言程序,二叉树先序遍历C语言实现

    二叉树先序遍历C语言实现 二叉树先序遍历的实现思想是: 访问根节点: 访问当前节点的左子树: 若当前节点无左子树,则访问当前节点的右子树: 以图 1 为例,采用先序遍历的思想遍历该二叉树的过程为: 访 ...

  2. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  3. C语言-数据结构-二叉树的递归遍历和非递归遍历

    看了大量网络相关的理论和程序,多数的C++ 写的,这里使用devC++ 编程语言 C语言; 整合王道考研答案和理论, 还有小甲鱼的数据结构, 郝斌的数据结构,各有特点吧 最值得研究的还是后序遍历的非递 ...

  4. c语言实现二叉树的递归遍历

    c语言实现二叉树递归遍历,首先用结构体给出结点类型,然后创建具体的结点变量,接着对结点进行连接.递归遍历的函数的内部主要是根节点的打印和左右子树的递归,前中后序的实现通过调整递归的顺序即可完成. ps ...

  5. 【C语言】二叉树中序遍历(递归和非递归)算法

    二叉树中序遍历的实现思想是: 访问当前节点的左子树: 访问根节点: 访问当前节点的右子树: 图 1 二叉树 以图  1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1: ...

  6. C语言实现二叉树的层次遍历

    1:思路 想要实现层次遍历,我们需要顺序存储二叉树每一行从左到右的根节点的值.那么我们需要用到链表队列来实现,因为队列有个特性就是队尾进,队头出.这个特性能够让我们很好的实现层次遍历. 2:过程 我们 ...

  7. 【数据结构与算法】之深入解析“二叉树的前序遍历”的求解思路与算法示例

    一.题目要求 给你二叉树的根节点 root ,返回它节点值的前序遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,2,3] 示例 2: 输入࿱

  8. 【数据结构与算法】之深入解析“二叉树的层序遍历”的求解思路与算法示例

    一.题目要求 给你二叉树的根节点 root ,返回其节点值的层序遍历 (即逐层地,从左到右访问所有节点). 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3

  9. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

最新文章

  1. PatchMatchStereo中的深度/视差传播策略
  2. please wait while windows configures microsoft visual studio professional 2013
  3. python中变量名有哪些_Python变量范围有哪些?如何在Python中定义变量?
  4. android subString
  5. C# WPF MVVM项目实战(进阶①)
  6. (计算机组成原理)第一章计算机系统概述-第二节:计算机硬件组成(存储器、运算器和控制器概述及计算机工作过程详解)
  7. Bean context must contain FilterChainProxy
  8. 如何判断链表有环并计算环的长度
  9. php在线白板,C#实现网络电子白板、课件功能 (在线教学系统)
  10. 记一次失败的RecycleView滑动定位
  11. [图灵程序设计丛书].持续交付:发布可靠软件的系统方法.pdf
  12. 【流媒体服务】海康摄像头RTSP视频推流、转码、拉流、直播综合应用(六):【1】VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播
  13. 网易2012校园招聘笔试题目
  14. RGB颜色查询对照代码表
  15. Unity开发者的C#内存管理
  16. Flink 常见面试题
  17. 联想T260 G3服务器系统安装手册
  18. 当把Python的过程文件发给其他人,如何方便别人快速下载过程文件所需要的库
  19. 医学图像处理涉及到的窗宽窗位 1
  20. oracle热备份全过程,oracle数据库热备份的简单实现过程

热门文章

  1. Jquery乱码终极解决方案
  2. Leetcode 392.判断子序列
  3. 中序遍历+后序/先序遍历构建二叉树
  4. 完全二叉树的结点数计算
  5. latex参考文献出现[S.1.]或[S.1.s.n.]
  6. python 读取csv文件
  7. 移动前端开发之viewport的深入理解 --- 待续
  8. canvas浅谈 实现简单的自旋转下落
  9. Flex中添加大量组件时内存占用问题
  10. 【剑指offer】面试题五:从尾到头打印链表