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 ...
随机推荐
- 禁用 Bootstrap 模态框(Modal) 点击空白时自动关闭
在做项目的时候,来了这么一个需求,要求打开模态框后,点击空白的地方不让他自动关闭,只能点击关闭按钮才能关闭. 有了需求,就开始查找资料寻求解决的方法. 我找到的解决方法如下: $('#registCo ...
- 201903-1 小中大 Java
思路: 中位数就是排序后中间的那个数.如果有偶数个数,就是中间两个数的平均值. 注意,这个平均值可能是整数,可能是小数,如果都是一样的处理,如果输出整数是3.0,而不是3,就有问题.所以需要分开处理. ...
- PIP一次性导入所有环境和指定镜像源
镜像源: 阿里云:https://mirrors.aliyun.com/pypi/simple/豆瓣:https://pypi.douban.com/simple/清华大学:https://pypi. ...
- Python说文解字_Python之多任务_04
问:并发.并行.同步.异步.阻塞.非阻塞 答: 并发.并行: 并发是指一个时间段内(不是指的时间点),有几个程序在同一个CPU上运行,但是任意时刻只有一个程序在CPU上运行.对人类的时钟来说1秒钟能干 ...
- CTF -bugku-web-web基础 矛盾
---恢复内容开始--- 以GET方式获取参数 is_numeric()函数是判断是否为数字或者数字字符串 所以不能是数字或者数字字符串,但是下面$num == 1 有要求为数字1 所以构造1+任意字 ...
- vmbox 导入虚拟电脑之后无法上网
先执行 ip addr 查看有没有分配ip 用root执行dhclient -v命令去通过DHCP协议获取一个ip,在下图的最后一行可以看到ip已经分配成功dhclient命令可以用来释放你的电脑的I ...
- 安装adobe reader阅读器
首先 在我的网盘里有那个软件. 安装的教程在这个歌网址:http://www.zhanshaoyi.com/6730.html
- Django1.11基础视图
Django视图 路由命名与reverse反解析 在项目urls中的include函数,使用namespace参数定义路由命名空间 url(r'^',incude('book.urls',namesp ...
- ipa提取png图片,windows下显示黑色
原因:ipa提取的png图片经过xcode特殊格式处理,在windows下查看会显示黑色 方法1:通过“ ipin.py文件”转化 过程: 1.安装python,需2.7版本,本文使用2.7.5 ...
- PowerDesigner 表格导出为excel(转载)
选中tablesctrl + shift +x 然后运行脚本 '******************************************************************** ...