二叉树的非递归算法

先序遍历非递归算法1

先序遍历非递归算法2

非递归交换左右孩子算法

使用栈来实现二叉树的非递归算法
栈的基本算法

#include<stdio.h>
#include<bits/stdc++.h>
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0typedef char TElemType;// ------栈的顺序存储结构表示----------
#define STACK_INIT_SIZE 100     // 存储空间初始分配量
#define STACK_INCREMENT 10  // 存储空间分配增量
typedef struct BiNode
{TElemType data;struct BiNode *lchild;struct BiNode *rchild;
}BiNode,*BiTree;typedef BiNode*  ElemType;
typedef struct {ElemType *base;     // 栈底指针ElemType *top;   // 栈顶指针int stacksize;   // 栈空间大小
} SqStack;void InitStack(SqStack &S)
{// 构造一个空栈Sif(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType))))exit(OVERFLOW);     // 存储分配失败S.top = S.base;S.stacksize = STACK_INIT_SIZE;
}void DestroyStack(SqStack &S)
{// 销毁栈S,S不再存在free(S.base);S.base = NULL;S.top = NULL;S.stacksize = 0;
}void Push(SqStack &S, ElemType e)
{if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间S.base = (ElemType *)realloc(S.base, (S.stacksize + STACK_INCREMENT) * sizeof(ElemType));if(!S.base)exit(OVERFLOW);           // 存储分配失败S.top = S.base + S.stacksize;S.stacksize += STACK_INCREMENT;}*(S.top)++ = e;
}Status Pop(SqStack &S, ElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;// 否则返回ERRORif(S.top == S.base)return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, ElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;// 否则返回ERRORif(S.top > S.base) {e = *(S.top - 1);return OK;}elsereturn ERROR;
}Status StackEmpty(SqStack S)
{// 若栈S为空栈,则返回TRUE,否则返回FALSEif(S.top == S.base)return TRUE;elsereturn FALSE;
}

先序遍历非递归算法1

void preorder1(BiTree T)//先序遍历算法1
{BiTree p;SqStack st;InitStack(st);if(T!=NULL){Push(st,T);//根结点进栈while(!StackEmpty(st))//栈不为空时循环{Pop(st,p);printf("%c ",p->data);//退栈结点p并访问if(p->rchild!=NULL)//有右孩子时将其进栈Push(st,p->rchild);if(p->lchild!=NULL)//有左孩子时将其进栈Push(st,p->lchild);}}
}

先序遍历非递归算法2

void preorder2(BiTree T)//先序遍历算法2
{BiTree p;SqStack st;InitStack(st);p=T;while(!StackEmpty(st)||p!=NULL){while(p!=NULL)//访问结点p及其所有左下结点并进栈{printf("%c ",p->data);Push(st,p);p=p->lchild;   }if(!StackEmpty(st))//若栈不空{Pop(st,p);//出栈结点pp=p->rchild;//转向处理其右子树}}}


void Inorder2(BiTree T)//中序遍历算法2
{BiTree p;SqStack st;InitStack(st);p=T;while(!StackEmpty(st)||p!=NULL){while(p!=NULL){Push(st,p);p=p->lchild;}if(!StackEmpty(st)){Pop(st,p);printf("%c ",p->data);p=p->rchild;}}}

非递归交换左右孩子算法
思路:与二叉树的非递归遍历算法相似


void Exchange_lchild_rchild(BiTree T)//交换左右子树算法
{BiTree p;SqStack st;InitStack(st);if(T==NULL) return; if(T->lchild!=NULL||T->rchild!=NULL)//只要是非叶子结点 {Push(st,T);//根结点进栈while(!StackEmpty(st))//栈不为空时循环{Pop(st,p);BiTree temp;temp=p->lchild;p->lchild=p->rchild;p->rchild=temp;if(p->rchild!=NULL)//有右孩子时将其进栈Push(st,p->rchild);if(p->lchild!=NULL)//有左孩子时将其进栈Push(st,p->lchild);}}}

全部代码(可执行代码):

#include<stdio.h>
#include<bits/stdc++.h>
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0typedef char TElemType;// ------栈的顺序存储结构表示----------
#define STACK_INIT_SIZE 100     // 存储空间初始分配量
#define STACK_INCREMENT 10  // 存储空间分配增量
typedef struct BiNode
{TElemType data;struct BiNode *lchild;struct BiNode *rchild;
}BiNode,*BiTree;typedef BiNode*  ElemType;
typedef struct {ElemType *base;     // 栈底指针ElemType *top;   // 栈顶指针int stacksize;   // 栈空间大小
} SqStack;void InitStack(SqStack &S)
{// 构造一个空栈Sif(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType))))exit(OVERFLOW);     // 存储分配失败S.top = S.base;S.stacksize = STACK_INIT_SIZE;
}void DestroyStack(SqStack &S)
{// 销毁栈S,S不再存在free(S.base);S.base = NULL;S.top = NULL;S.stacksize = 0;
}void Push(SqStack &S, ElemType e)
{if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间S.base = (ElemType *)realloc(S.base, (S.stacksize + STACK_INCREMENT) * sizeof(ElemType));if(!S.base)exit(OVERFLOW);           // 存储分配失败S.top = S.base + S.stacksize;S.stacksize += STACK_INCREMENT;}*(S.top)++ = e;
}Status Pop(SqStack &S, ElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;// 否则返回ERRORif(S.top == S.base)return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, ElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;// 否则返回ERRORif(S.top > S.base) {e = *(S.top - 1);return OK;}elsereturn ERROR;
}Status StackEmpty(SqStack S)
{// 若栈S为空栈,则返回TRUE,否则返回FALSEif(S.top == S.base)return TRUE;elsereturn FALSE;
}void CreateBiTree(BiTree &T)//二叉树的创建
{TElemType ch;scanf("%c",&ch);if(ch=='#')T=NULL;else {T=(BiNode*)malloc(sizeof(BiNode));if(!T)exit(-1);T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
}void DestroyBiTree(BiTree &T)//二叉树的销毁算法
{if(T==NULL)exit(-1);else{DestroyBiTree(T->lchild);DestroyBiTree(T->rchild);free(T);}
}void preorder1(BiTree T)//先序遍历算法1
{BiTree p;SqStack st;InitStack(st);if(T!=NULL){Push(st,T);//根结点进栈while(!StackEmpty(st))//栈不为空时循环{Pop(st,p);printf("%c ",p->data);//退栈结点p并访问if(p->rchild!=NULL)//有右孩子时将其进栈Push(st,p->rchild);if(p->lchild!=NULL)//有左孩子时将其进栈Push(st,p->lchild);}}
}void preorder2(BiTree T)//先序遍历算法2
{BiTree p;SqStack st;InitStack(st);p=T;while(!StackEmpty(st)||p!=NULL){while(p!=NULL)//访问结点p及其所有左下结点并进栈{printf("%c ",p->data);Push(st,p);p=p->lchild;   }if(!StackEmpty(st))//若栈不空{Pop(st,p);//出栈结点pp=p->rchild;//转向处理其右子树}}}void Inorder2(BiTree T)//中序遍历算法2
{BiTree p;SqStack st;InitStack(st);p=T;while(!StackEmpty(st)||p!=NULL){while(p!=NULL){Push(st,p);p=p->lchild;}if(!StackEmpty(st)){Pop(st,p);printf("%c ",p->data);p=p->rchild;}}}void postorder(BiTree T)
{BiTree p;SqStack st;InitStack(st);p=T;BiTree r;r=NULL;while(p||!StackEmpty(st)){if(p!=NULL){Push(st,p);p=p->lchild;}else //(p==NULL) {GetTop(st, p);if(p->rchild&&p->rchild!=r){p=p->rchild;Push(st,p);p=p->lchild;}else{Pop(st,p);printf("%c ",p->data);r=p;p=NULL;} }}} void Exchange_lchild_rchild(BiTree T)//交换左右子树算法
{BiTree p;SqStack st;InitStack(st);if(T==NULL) return; if(T->lchild!=NULL||T->rchild!=NULL)//只要是非叶子结点 {Push(st,T);//根结点进栈while(!StackEmpty(st))//栈不为空时循环{Pop(st,p);BiTree temp;temp=p->lchild;p->lchild=p->rchild;p->rchild=temp;if(p->rchild!=NULL)//有右孩子时将其进栈Push(st,p->rchild);if(p->lchild!=NULL)//有左孩子时将其进栈Push(st,p->lchild);}}}int main()
{BiTree T;printf("创建树输入树的先序序列\n");CreateBiTree(T);printf("\n先序遍历算法1:");preorder1(T);printf("\n二叉树交换左右孩子算法");Exchange_lchild_rchild(T);printf("\n先序遍历算法2:");preorder2(T);printf("\n中序遍历算法2:");Inorder2(T);printf("\n后序遍历算法1: ");postorder(T);
}


数据结构——二叉树的非递归算法相关推荐

  1. (※)中序遍历二叉树的非递归算法

    在此之前,我们已经学习了中序遍历二叉树的递归算法,相信大家已经将其牢牢掌握了. 除了使用递归思想作为求解问题的钥匙,还可以借助栈来以非递归方式实现该问题的求解. 首先,我们要讨论存储二叉树结点信息的栈 ...

  2. 数据结构-二叉树的非递归遍历

    前面的章节我们实现了二叉树最基本的遍历方式:递归遍历,代码是如此的简洁:辣么我们为什么还要去学习二叉树的非递归遍历方式呢?众所周知,递归优点是将可以将复杂的问题简单化即大问题拆分成一个个小问题,那么它 ...

  3. 二叉树的非递归算法(C++实现)

    接着上面一篇博客,我们开始叙述有关二叉树的非递归遍历的实现. 这里我们附上上一篇blog的链接:https://blog.csdn.net/weixin_36997518/article/detail ...

  4. 【数据结构】快速排序非递归算法及其改进

    在学数据结构中排序这一章节的时候,有一道有关快速排序的作业题描述如下: 按下述要求编写快速排序的非递归算法: 定义一个栈(或队列),把整个序列的上.下界入栈(或队列).当栈(或队列)非空时进行如下操作 ...

  5. 遍历二叉树的非递归算法

    编写的方法:根据树中结点的遍历规律及顺序直接写出其非递归算法. 先序非递归算法 [思路] 假设:T是要遍历树的根指针,若T != NULL 对于非递归算法,引入栈模拟递归工作栈,初始时栈为空. 问题: ...

  6. 树与二叉树——后序遍历二叉树的非递归算法

    算法思想:后序非递归遍历二叉树是先访问左子树,再访问右子树,最后访问根节点. ①若根节点有左孩子,则左孩子以此入栈,直到左孩子为空,然后读取栈顶元素,若其右孩子不为空且未被访问过,则对右子树执行①.否 ...

  7. 创建二叉树的非递归算法实现

    非递归创建二叉树(中序)算法核心思路: 1)从根节点到左子树的叶子节点(创建节点.节点压栈): 2)记录每个节点的状态分三种情况:初始状态.左子树建立完成状态.右子树建立完成状态: 3)左右子树创建完 ...

  8. 遍历二叉树的递归算法与非递归算法

    遍历二叉树的递归算法与非递归算法 先来看下面这棵二叉树.如图1.现在我们要对它进行先序遍历.递归思想:就是把这个大树拆分成N棵小树,每棵小树都进行一次先序遍历.再把这些遍历连合起来就是这棵树的先序遍历 ...

  9. 递归算法到非递归算法的转换

    递归实质在定义自身的同时又出现了对自身的调用.递归算法是许多软件编程人员常用的方法,结构简单.清晰.可读性好.但在实际应用中也存在一些问题:1.并不是每一门语言都支持递归,比较典型的FORTRAN语言 ...

最新文章

  1. plot、bar、stem、area函数绘图
  2. STL 之swap, iter_swap, swap_ranges
  3. 深入理解Java类加载机制
  4. 发那科pmc地址分配_一台全新的FANUC数控机床,请简述有挡块回参功能的实现步骤?包括PMC的I/O分配、具体参数设定、梯形图程序...
  5. 清华大学《操作系统》(十一):处理机调度
  6. 计算与推断思维 四、数据类型
  7. 已被骗数百万美金!App Store 中诈骗应用横行,网友:“苹果只顾抽成!”
  8. 室内定位---UWB测距及定位原理
  9. Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口
  10. 六款值得推荐的数据挖掘得力助手
  11. PRML exercises 10.3 解析
  12. 大华条码秤数据同步发送数据格式
  13. [Daozy][区块链 EOS 课程]第2课 EOS编译和启动
  14. 世界陶瓷卫浴100强榜单发布!
  15. Python+Vue计算机毕业设计教师教学质量评价管理2lbw7(程序+LW+源码+部署)
  16. BLE MESH组网(一)简介和基本概念
  17. 泛函分析的几个空间和平行四边形法则
  18. 西电软工oop面向对象程序设计实验二上机报告
  19. LocalSend - 无需联网,开源跨平台的局域网文件互传工具(AirDrop 替代品)
  20. 如何查询本人医保就医明细

热门文章

  1. 博客园官方 NuGet镜像上线试运行
  2. java如何输出线程的标识符_Java多线程面试题
  3. Android之BaseQuickAdapter(3.0.4版本)给子view添加点击事件(helper.addOnClickListener(view))的函数没了
  4. Android之通过adb shell getprop、netstat命令看dns、ip
  5. linux c之孤儿进程与僵尸进程[总结]
  6. 字符串之将整数字符串转成整数值
  7. 堆的构建、堆的插入、堆的删除、堆排序
  8. 这些潮汕美食你吃过没有?
  9. 三年租男友回家竟花了10万......
  10. 豆瓣评分9.4分!这部大片你不应该错过,每一秒都是不敢看的残忍!