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 ...
随机推荐
- 【新年呈献】高性能网络通信框架 HP-Socket v5.7.1
项目主页 : http://www.oschina.net/p/hp-socket 开发文档 : https://www.docin.com/p-2287339564.html 下载地址 : http ...
- 第42章 AWR报表的使用
第42章 AWR报表的使用exec dbms_gather.gather_table_stats('scott','emp');exec dbms_gather_gather_index_stats( ...
- pyCharm中设置查看运行过程中的变量实时情况
1.点击运行栏的这个灰色向下剪头: 2.单击“Edit Configurations”, 3.在出现的窗口上,勾选上:“Show command line afterwards” 或 “run wit ...
- Linux基础(1) 安装
Linux基础 一.创建CentOS 7 Linux虚拟机 1.安装虚拟机 桥接网络:相当于这台机器就是物理机,多个电脑在连接在一个交换机上,同一个子网 NAT:这台机器只能通过物理机(相当于 ...
- Golang---序列化和反序列化
为什么要序列化和反序列化 我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,目前存在很多编码格式:json, XML, Gob, Google Protocol Buffer 等, ...
- 不同的二叉搜索树&II
不同的二叉搜索树 只要求个数,递推根节点分割左右子树即可 class Solution { public int numTrees(int n) { int []dp=new int[n+1]; fo ...
- Codeforces 1296E1 - String Coloring (easy version)
题目大意: 给定一段长度为n的字符串s 你需要给每个字符进行涂色,然后相邻的不同色的字符可以进行交换 需要保证涂色后能通过相邻交换把这个字符串按照字典序排序(a~z) 你只有两种颜色可以用来涂 问是否 ...
- Socket通讯的简单用法
1.客户端 package Thread; import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...
- sendmail 的安装、配置与发送邮件的具体实现
Ubuntu 中sendmail 的安装.配置与发送邮件的具体实现 centos安装sendmail与使用详解 CentOS下搭建Sendmail邮件服务器 使用外部SMTP发送邮件 使用mailx ...
- Java执行js加密算法
Java执行js加密算法 今日需求:在后端执行一段加密算法,算法是js写的 明白需求以后疯狂百度.最后发现JDK提供了各种脚本的支持(怪笔者学艺不精,第一次见识到这个库,留下不学无术的泪水),正题开始 ...