<二叉树 前中后 层序 非递归遍历 c语言实现>
来源:互联网 发布:c 语言入门经典 编辑:程序博客网 时间:2024/05/22 00:45
非递归遍历要用到stack,出栈即访问
前序遍历:(中结点->左结点->右节点)
思路:先将根节点入栈,之后进入循环,先出栈一个结点A, 之后如果存在的话,将A的右结点入栈,再将A的左结点入栈,之后继续循环。。这样一直循环到栈空为止。
中序遍历: (左结点->中结点->右节点)
思路:扫描根节点,将其所有左孩子结点全部入栈, 之后出栈一个结点A,之后再扫描A结点的右孩子结点,进入循环。一直循环到栈空。
后序遍历:(左结点->右结点->中节点)
思路: 跟中序的差不多,只是在出栈的时候多了个条件限制,必须A左右孩子结点都出栈了,A结点才能出栈,此时需要用个结点指针pre来记录上一个访问的结点。
判断条件: A ->right == pre || A->right ==NULL
若A->right =NULL,则可以直接将A出栈,因为他没有右孩子结点了。
层序遍历:(层序遍历要使用队列,先进先出,后进后出。)
思路: 先将根节点入队,之后只要队列不为空就进入循环,循环内先出队头元素A,之后将A的左孩子跟右孩子再入队,这样一直循环到队列为空为止。
(出队即访问结点)
代码如下:
#include <stdio.h>#include <malloc.h>typedef struct node{int data;struct node *left,*right;}Node, *Tree;Tree createTree(){int x;printf("请输入结点的值(0代表空结点) :");scanf("%d",&x);if(x){Node *node = (Node *) malloc(sizeof(Tree));node->data = x;node->left = createTree();node->right = createTree();return node;}elsereturn NULL;}void preView(Tree tree){Node *stack[100],*p;int top = -1;p = tree;stack[++top] = p;while(top > -1){Node *temp = stack[top--];printf("%d ",temp->data);if(temp->right) stack[++top] = temp->right;if(temp->left) stack[++top] = temp->left;}printf("\n");}void midView(Tree tree){Node *stack[100],*p;int top = -1;p = tree;while(top > -1 || p){while(p){stack[++top] = p;p = p->left;}if(top > -1){p = stack[top--];printf("%d ",p->data);p = p->right;}}printf("\n");}void postView(Tree tree){Node *stack[100],*p,*pre;p = tree;int top = -1;do{while(p){stack[++top] = p;p = p->left;}p = stack[top];if(p->right == pre || p->right == NULL){printf("%d ",p->data);top--;pre = p;p = NULL;}else{p = p->right;}}while(top > -1);printf("\n");}void levelView(Tree tree){ Node *queue[100]; int first,end; first = 0, end = 0; queue[end++] = tree; while(end > first) { Node *temp = queue[first++]; printf("%d ",temp->data); if(temp->left) queue[end++] = temp->left; if(temp->right) queue[end++] = temp->right; } printf("\n");}
int main(){Tree tree = createTree();preView(tree);midView(tree);postView(tree);return 0;}
- <二叉树 前中后 层序 非递归遍历 c语言实现>
- <二叉树 前中后 层序 非递归遍历 c语言实现>
- 二叉树的创建、前序中序后序递归遍历与非递归遍历、层序遍历以及二叉树简单应用的C语言实现
- C语言非递归实现二叉树的先序、中序、后序、层序遍历
- 数据结构的C实现_二叉树的非递归遍历和层序遍历
- 二叉树遍历的c语言非递归实现
- 二叉树非递归遍历C语言实现
- 二叉树非递归遍历C语言实现
- 二叉树的非递归遍历C语言实现
- C语言实现二叉树的递归遍历与非递归遍历
- C语言实现二叉树的递归遍历和非递归遍历
- C语言实现二叉树的递归遍历与非递归遍历
- 用java实现二叉树相关操作(前序建树,前中后递归非递归遍历,层序遍历)
- c语言原生实现二叉树的 非递归 中序 先序 后序 遍历
- 二叉树非递归遍历----前中后及层序的java实现
- C语言实现二叉树的常用的算法(递归与非递归实现遍历)
- C语言二叉树的遍历,递归和非递归
- 二叉树遍历(递归,非递归,层序)
- linux 下fcntl的使用
- GetWindowRect和GetClientRect
- 关于ORA-01034和ORA-27101的一种解决方法
- 【iOS开发】---- UIView动画
- Mongoose源码剖析:mongoose的工作模型
- <二叉树 前中后 层序 非递归遍历 c语言实现>
- activity的生命周期
- 通向架构师的道路(第四天)之Tomcat性能调优-让小猫飞奔(暂时忽略)
- 一个题目涉及到的50个Sql语句
- Hadoop Streaming Input and Output
- Mongoose源码剖析:外篇之web服务器
- 通向架构师的道路(第五天)之tomcat集群-群猫乱舞
- Centos 同步时间
- Android UI学习 - TableLayout