BTree非递归
preorder
void PreOrder(BTNode* b)
{
BTNode* p = b;
SqStack* st;
InitStack(st);
if (b != NULL)
{
Push(st, p);
while (!StackEmpty(st))
{
Pop(st,p);
printf("%c", p->data);
if (p->rchild != NULL)
{
Push(st,p->rchild);
}
if (p->lchild != NULL)
{
Push(st,p->lchild);
}
}
printf("\n");
}
DestroyStack(st);
}
void PreOrder1(BTNode* b)
{
BTNode* p = b;
SqStack* st;
InitStack(st);
while(p != NULL || !StackEmpty(st))
{
while (p != NULL)
{
printf("%c", p->data);
Push(st,p);
p = p->lchild;
}
if (!StackEmpty(st))
{
Pop(st, p);
p = p->rchild;
}
}
printf("\n");
DestroyStack(st);
}
inorder
void InOrder(BTNode* b)
{
BTNode* p = b;
SqStack* st;
InitStack(st); while (p != NULL || !StackEmpty(st))
{
while (p != NULL)
{
Push(st,p);
p = p->lchild;
}
if (!StackEmpty(st))
{
Pop(st, p);
printf("%c", p->data);
p = p->rchild;
}
}
printf("\n");
DestroyStack(st);
}
postorder
void PostOrder(BTNode* b)
{
BTNode* p = b;
BTNode* r;
SqStack* st;
InitStack(st);
bool flag;
do
{
while (p != NULL)
{
Push(st,p);
p = p->lchild;
}
r = NULL;
flag= true;
while (!StackEmpty(st) && flag)
{
GetTop(st, p);
if (r == NULL&&p->rchild==NULL)
{
printf("%c", p->data);
Pop(st, p);
r = (BTNode*)malloc(sizeof(BTNode));
r->data = p->data;
}
else if ((r != NULL&&p->rchild!=NULL)&&r->data==p->rchild->data)
{
printf("%c", p->data);
Pop(st, p);
r = (BTNode*)malloc(sizeof(BTNode));
r->data = p->data;
}
else
{
p = p->rchild;
flag = false;
}
}
} while (!StackEmpty(st));
printf("\n");
DestroyStack(st);
}
层次遍历
typedef struct {
BTNode data[MAXSIZE];
int front, rear;
}SqQueue;
void LevelOrder(BTNode* b)
{
SqQueue* q;
InitQueue(q);
BTNode* p = b;
enQueue(q,p);
while (!QueueEmpty(q))
{
deQueue(q, p);
printf("%c", p->data);
if (p->lchild != NULL)
enQueue(q, p->lchild);
if (p->rchild != NULL)
enQueue(q, p->rchild);
}
}
利用层次遍历输出从根结点到每个叶子结点的逆路径
typedef struct {
BTNode* pt;
int parent;
}NodeType;
typedef struct {
NodeType data[MAXSIZE];
int front, rear;
}QuType
void AllPath2(BTNode* b)
{
int k;
BTNode* p;
QuType* qu;
InitQueue2(qu);
NodeType* qelem = (NodeType*)malloc(sizeof(NodeType));
qelem->pt = b;
qelem->parent = -1;
enQueue2(qu,qelem);
while (!QueueEmpty2(qu))
{
deQueue2(qu, qelem);
p = qelem->pt;
if (p->lchild == NULL && p->rchild == NULL)
{
k = qu->front;
while (qu->data[k].parent != -1)
{
printf("%c", qu->data[k].pt->data);
k = qu->data[k].parent;
}
printf("%c\n", qu->data[k].pt->data); }
if (p->lchild != NULL)
{
qelem->pt = p->lchild;
qelem->parent = qu->front;
enQueue2(qu, qelem);
}
if (p->rchild != NULL)
{
qelem->pt = p->rchild;
qelem->parent = qu->front;
enQueue2(qu, qelem);
}
}
}
BTree非递归的更多相关文章
- java数据结构之二叉树遍历的非递归实现
算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...
- C++实现二叉树(建树,前序,中序,后序)递归和非递归实现
#include<iostream> #include<string.h> #include<stack> using namespace std; typedef ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
- C语言递归,非递归实现翻转链表
翻转链表作为,链表的常用操作,也是面试常遇到的. 分析非递归分析: 非递归用的小技巧比较多,很容易出错. 递归分析比较简单,在代码里面 代码: #include<stdio.h> #inc ...
- 非递归创建二叉树( C++队列 )
非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 f ...
- python非递归全排列
刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...
- Best Coder Round#25 1003 树的非递归访问
虽然官方解释是这题目里的树看作无向无环图,从答案来看还是在“以1作为根节点”这一前提下进行的,这棵树搭建好以后,从叶节点开始访问,一直推到根节点即可——很像动态规划的“自底向上”. 但这棵树的搭建堪忧 ...
- 排序算法练习--JAVA(插入、直接选择、冒泡、快速排序、非递归快速排序)
排序算法是数据结构中的经典算法知识点,也是笔试面试中经常考察的问题,平常学的不扎实笔试时候容易出洋相,回来恶补,尤其是碰到递归很可能被问到怎么用非递归实现... package sort; impor ...
- C语言实现 二分查找数组中的Key值(递归和非递归)
基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include <stdio.h> int ...
随机推荐
- filebeat+redis+logstash+elasticsearch基本配置--适用于6.4版本
filebeat配置: filebeat.inputs:- type: log enabled: true paths: - /opt/xxxx.log fields: ...
- 翻翻棋(找规律问题)(FZU Problem 2230)
题目是这样的: FZU Problem 2230 象棋翻翻棋(暗棋)中双方在4*8的格子中交战,有时候最后会只剩下帅和将.根据暗棋的规则,棋子只能上下左右移动,且相同的级别下,主动移动到地方棋子方将吃 ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:数据类型
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- iOS基础——通过案例学知识之xib、plist、mvc
透过案例学习xib的使用.plist的使用.mvc在iOS的使用,今天要做的案例效果图 1.xib和nib xib文件可以被XCode编译成nib文件,xib文件本质上是一个xml文件,而nib文件就 ...
- pycharm 的 使用 设置智能目录 Pycharm 断点跳转及 Step Over/Step Into/Step Out 等的区别
pycharm 右键点击文件夹 有个mark directiory as 根据需要给目录进行设置 Pycharm调试程序时,有时需要直接从第一个断点跳转至第二个断点,如果还是用单步调试的话就非常 ...
- c#中的Task异步编程
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/index翻译 1. 引入 Task异步 ...
- (转)绝对路径${pageContext.request.contextPath}用法及其与web.xml中Servlet的url-pattern匹配过程
以系统的一个“添加商品”的功能为例加以说明,系统页面为add.jsp,如图一所示: 图一 添加商品界面 系统的代码目录结构及add.jsp代码如图二所示: 图二 系统的代码目录结构及add.js ...
- postman问题
问题1:postman请求出现 'SSL certificate verification' ,实际为https的问题 解决: 1)关闭fiddler 2)或在File > Settings & ...
- 面试准备 HTTP协议
http协议的主要特点 简单快速 //某个资源是固定的 (统一资源符)UII 灵活 //http头部有个数据类型,完成不同数据类型的传输 无连接 //链接一次就会断开 无状态 //客户端和服务端 ...
- python format输出
http://www.cnblogs.com/nulige/p/6115793.html 2.Format 方式 [[fill]align][sign][#][0][width][,][.precis ...