C语言非递归后序遍历二叉树

作者:数星星的咚咚咚 时间:2023-12-13 18:05:45 

本文实例为大家分享了C语言非递归后序遍历二叉树的具体代码,供大家参考,具体内容如下

法一:实现思路:一个栈 先按 根->右子树->左子树的顺序访问二叉树。访问时不输出。另一个栈存入前一个栈只进栈的结点。

最后输出后一个栈的结点数据。


#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
 char element;
 struct TreeNode *left,*right;
}Tree,*BTree;
typedef struct StackNode{
 BTree data;
 struct StackNode *next;
}Stack,*PStack;
typedef struct{
 PStack top;
}LinkStack,*PLinkStack;
//初始化空栈
PLinkStack Init_Stack(void){
 PLinkStack S;
 S=(PLinkStack)malloc(sizeof(LinkStack));
 if(S){
   S->top=NULL;
 }
 return S;
}
//压栈
void Push_Stack(PLinkStack S,BTree T){
 PStack p;
 p=(PStack)malloc(sizeof(Stack));
 p->data=T;
 p->next=S->top;
 S->top=p;
}
//判空
int empty_Stack(PLinkStack S){
 if(S->top){
   return 0;
 }else{
   return 1;
 }
}
//出栈
PStack Pop_Stack(PLinkStack S){
 PStack q;
 if(empty_Stack(S)){
   return S->top;
 }else{
   q=S->top;
   S->top=S->top->next;
 }
 return q;  
}
//销毁栈
void DestroyStack(PLinkStack S){
 PStack del;
 while(S->top!=NULL){
   del=S->top;
   S->top=S->top->next;
   free(del);
 }
 free(S);
}
BTree BuildTree(void){
 char ch;
 BTree node;
 ch=getchar();
 if(ch=='#'){
   node=NULL;
 }else{
   node=(BTree)malloc(sizeof(Tree));
   node->element=ch;
   node->left=BuildTree();
   node->right=BuildTree();
 }
 return node;
}
void NotRecursionPostOrder(BTree T){
 PLinkStack S,CS;
 S=Init_Stack();
 CS=Init_Stack();
 while(T || !empty_Stack(S)){
   if(T){
     Push_Stack(S,T);
     Push_Stack(CS,T);
     T=T->right;
   }else{
     T=Pop_Stack(S)->data;
     T=T->left;
   }
 }
 while(CS->top!=NULL){
   printf("%c",CS->top->data->element);
   CS->top=CS->top->next;
 }
 DestroyStack(CS);
}
int main(void){
 BTree T;
 T=BuildTree();
 NotRecursionPostOrder(T);
 return 0;
}

C语言非递归后序遍历二叉树

法二:实现思路。按先序遍历访问每一个结点。存入栈中,当为空时,就出立即栈(第一次出栈)。出栈后应该立即进栈,去访问进栈结点的右结点,这样可以保证先输出左、右结点,再输出根结点。二次进栈利用flag标记。


#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode {
 char element;
 int flag;
 struct TreeNode *left, *right;
}Tree, *BTree;
typedef struct StackNode {
 BTree data;
 struct StackNode *next;
}Stack, *PStack;
typedef struct {
 PStack top;
}LinkStack, *PLinkStack;
//初始化空栈
PLinkStack Init_Stack(void) {
 PLinkStack S = (PLinkStack)malloc(sizeof(LinkStack));
 if (S) {
   S->top = NULL;
 }
 return S;
}
//压栈
void Push_Stack(PLinkStack S, BTree T) {
 PStack p;
 p = (PStack)malloc(sizeof(Stack));
 p->data = T;
 p->next = S->top;
 S->top = p;
}
//判空
int empty_Stack(PLinkStack S) {
 if (S->top) {
   return 0;
 }
 else {
   return 1;
 }
}
//出栈
PStack Pop_Stack(PLinkStack S) {
 PStack q = S->top;
 S->top = S->top->next;
 return q;
}
BTree BuildTree(void) {
 BTree t;
 char ch;
 ch = getchar();
 if (ch == '#') {
   t = NULL;
 }
 else {
   t = (BTree)malloc(sizeof(Tree));
   t->element = ch;
   t->left = BuildTree();
   t->right = BuildTree();
 }
 return t;
}
void DestroyStack(PLinkStack S){
 PStack p;
 while(S->top){
   p=S->top;
   free(p);
   S->top=S->top->next;
 }
}
void NotRecursionPostOrder(BTree T) {
 PLinkStack S;
 S = Init_Stack();
 while (T || !empty_Stack(S)) {
   if (T) {
     T->flag = 0;
     Push_Stack(S, T);
     T = T->left;
   }
   else {
     T = Pop_Stack(S)->data;
     if (T->flag == 0) {
       T->flag = 1;
       Push_Stack(S, T);
       T = T->right;
     }
     else {
       if (T->flag == 1) {
         printf("%c", T->element);
         T = NULL;
       }
     }
   }
 }
 DestroyStack(S);//销毁栈
}
int main(void) {
 BTree T;
 T = BuildTree();
 NotRecursionPostOrder(T);
 return 0;
}

C语言非递归后序遍历二叉树

来源:http://blog.csdn.net/chendongqaq/article/details/70832303

标签:C语言,非递归,二叉树
0
投稿

猜你喜欢

  • 使用Java方法配置Spring代码解析

    2023-07-15 09:20:59
  • Java桥梁设计模式优雅地将抽象与实现分离

    2023-12-11 14:56:36
  • C# 中的动态创建组件(属性及事件)的实现思路及方法

    2021-07-20 04:58:31
  • Android调试出现The selected device is incompatible问题解决

    2023-08-11 12:58:34
  • C语言数据类型转换实例代码

    2023-12-04 11:48:36
  • C#难点逐个击破(4):main函数

    2021-06-18 17:47:43
  • C#动态执行批处理命令的方法

    2023-03-16 23:19:40
  • Flutter中嵌入Android 原生TextView实例教程

    2023-07-05 02:02:00
  • SpringBoot整合MybatisPlus的教程详解

    2023-12-06 18:05:20
  • Android编程中沉浸式状态栏的三种实现方式详解

    2022-02-10 11:56:23
  • Java项目导入IDEA的流程配置以及常见问题解决方法

    2021-11-21 10:02:24
  • Java中避免空指针异常的方法

    2023-05-08 21:00:27
  • Intellij IDEA 2020.3 配置教程详解

    2023-07-01 21:34:23
  • 详解android进行异步更新UI的四种方式

    2023-12-24 19:46:55
  • 使用java生成json时产生栈溢出错误问题及解决方案

    2023-01-09 17:41:10
  • MyBatis中的JdbcType映射使用详解

    2023-09-07 20:05:38
  • C#中Dynamic和Dictionary性能比较

    2022-05-11 12:16:33
  • Java JVM运行时数据区(Run-Time Data Areas)

    2022-01-22 22:10:35
  • android自定义简单时钟

    2022-01-10 03:00:22
  • C#反射(Reflection)详解

    2022-09-16 22:58:11
  • asp之家 软件编程 m.aspxhome.com