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 ...
随机推荐
- JPA 开发中遇到的错误
JPA 开发中遇到的错误 (2011-07-13 16:56:12) 转载▼ 标签: 杂谈 分类: Java/J2EE 常见异常1.异常信息:org.hibernate.hql.ast.QuerySy ...
- POJ 2251:Dungeon Master
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20687 Accepted: 8004 D ...
- For循环的几个练习
1.括号里面只能放加或减,如果要使等式成立,括号里面应该放什么运算符12()34()56()78()9 = 59 2.蓝球弹起的高度篮球从10米高的地方落下,每次弹起的高度是原来的0.3倍,问弹跳10 ...
- Redis主从复制以及主从复制原理
Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API.从 2010年 3 月 15 日起,Redis 的开 ...
- 小程序调用wx.chooseLocation接口的时候无法获取权限(ios)
ios手机小程序调用wx.chooseLocation接口的时候,获取权限的时候报authorize:fail:require permission desc这样子的错误,这是由于苹果的安全机制导致需 ...
- 游戏引擎UE4详解!
UE4 的全名是 Unreal Engine 4,中文译为“虚幻引擎4”.UE4 是一款由 Epic Games 公司开发的开源.商业收费.学习免费的游戏引擎.那你了解UE4吗?如果还不清楚,就一起来 ...
- B. Odd Sum Segments CF(分割数组)
题目地址 http://codeforces.com/contest/1196/problem/B B. Odd Sum Segments time limit per test 3 seconds ...
- h5-伪元素-before和after
做一个门票或者邮票:效果图 1.html就是两个div 2.具体css代码 <style> /*左侧长方体基本样式*/ div:nth-of-type(1){ width: 300px; ...
- 每天一杯C_C89、C99、C11等之C语言标准
C语言的伟大之处在于C语言还是一个国际标准,这只“无形的手”掌控者其他派生语言和计算机的各个方面.起关于C语言被发明之后,ANSI和ISO相继发布关于C语言的标准.关于C90和C99,C89和C99容 ...
- Java开学测试感想
开学第一堂课就是测试,测试暑假的自学成果,老师说试卷适当提高了难度,所以允许查书和使用网络查询,经过近三个钟头的努力奋斗和痛苦挣扎,我只完成了一小部分的代码,只有简单的set()get()函数,以及简 ...