c语言 递归函数与栈,数据结构算法C语言实现(十)--- 3.3栈与递归的实现

一.简介

汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看。而且,递归在我看来和分治、DP、贪心等一样是十分优美的思想,值得学习!!!

二.CPP文件

//3_3.cpp

/**

author:zhaoyu

email:zhaoyu1995.com@gmail.com

date:2016-6-8

note:realize my textbook <>

*/

//Page 54

#include

int cnt = ;

void move(char a, int n, char b)

{

printf("%i\tmove disk %d from %c to %c\n", ++cnt, n, a, b);

}

void hanoi(int n, char x, char y, char z)

{

if ( == n)

{

move(x, , z);

}

else

{

hanoi(n-, x, z, y);

move(x, n, z);

hanoi(n-, y, x, z);

}

}

int main(int argc, char const *argv[])

{

int n;

scanf("%d", &n);

hanoi(n, 'X', 'Y', 'Z');

return ;

}

3_3.cpp

三.测试

三个:

01ccaaa30053df143c4a436acc2dd274.png

五个:

fd854a5bb6c59312291a725b92a4b431.png

容易看出,移动 n 个,需要 2^n - 1次。

数据结构算法C语言实现(二十)--- 6&period;3&period;1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

数据结构算法C语言实现(十二)--- 3&period;4循环队列&amp&semi;队列的顺序表示和实现

一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

数据结构算法C语言实现(八)--- 3&period;2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

数据结构算法C语言实现(六)---2&period;4一元多项式的表示及相加

一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

数据结构算法C语言实现(五)---2&period;3重新定义线性链表及其基本操作

一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...

数据结构算法C语言实现(二)---2&period;3线性表的链式表示和实现之单链表

一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

数据结构算法C语言实现(二十七)--- 7&period;2图的遍历

一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...

数据结构算法C语言实现(十一)--- 3&period;4队列的链式表示和实现

一.简介 FIFO. 二.头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@gmail.com date:2016-6-9 note:r ...

数据结构算法C语言实现(七)--- 3&period;1栈的线性实现及应用举例

一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 //3_1.h /** author:zhaoyu email: ...

随机推荐

ASP&period;NET 系列:单元测试

单元测试可以有效的可以在编码.设计.调试到重构等多方面显著提升我们的工作效率和质量.github上可供参考和学习的各种开源项目众多,NopCommerce.Orchard等以及微软的asp.net m ...

&lbrack;Stanford 2011&rsqb; 知识点小结

1.获得帮助:option+click /  option+double click 2.@property里的nonatomic,表示非原子性访问,atomic是obj-c里使用的一种线程保护技术, ...

VsFTP&plus;本地文件认证&plus;SSl实现虚拟用户配置

1.实验环境: [root@node21 ~]# cat /etc/centos-release CentOS release 6.8 (Final) [root@node21 ~]# uname - ...

asp&period;net传值

asp.net页面传至几种方法 Response.Redirect (或称 Query String 方式.URL方式) Response.Redirect("WebForm5.aspx&q ...

post请求时2种传参方式

@Testpublic void dopost(){ String httpurl = "https://jin.caimao.com/api/user/loginSalt"; M ...

【PHP】基础学习

摘要: 基础知识回顾 1)数组 2)字符串 3)时间 一.数组 1.1 数组分类索引数组:常规数组关联数组:键值对数组 二.字符串 2.1 定义字符串heredoc语法结构定义的字符串:$hello ...

WordPress Plugin Contact Form Builder &lbrack;CSRF &srarr; LFI&rsqb;

# Exploit Title: Contact Form Builder [CSRF → LFI]# Date: 2019-03-17# Exploit Author: Panagiotis Vag ...

PS制作墙壁上海报卷页图片效果

1.首先,打开PS,新建合适的画布. 2.为了使背景具有质感,执行滤镜—滤镜库—纹理化,具体参数按你的感觉来. 3.新建画布“图层1”,为了方便观察,填充为灰色画布,ctrl+t适当缩小画布大小,如图 ...

阶乘函数(factorial)——结果在整型范围内的阶乘计算

定义: 在数学中,正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,计为n!,例如5的阶乘计为5!,其值为120: \[ 5!=5\times 4\times 3\times ...

python技巧 使用值来排序一个字典

In [8]: a={'x':11,'y':22,'c':4} In [9]: import operator In [10]: sorted(a.items(),key=operator.itemg ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后序遍历的非递归算法可以使用实现。具体步骤如下: 1. 初始化一个空,将根节点压入中。 2. 取出顶元素,如果该元素没有左右子节点,则输出该元素的值,如果有,则按照右节点、左节点的顺序依次将其子节点压入中。 3. 重复第2步,直到为空。 下面是C语言代码实现: ```c void postOrderTraversal(TreeNode* root) { if (root == NULL) return; Stack stack; TreeNode* prev = NULL; push(&stack, root); while (!isEmpty(&stack)) { TreeNode* curr = peek(&stack); if (prev == NULL || prev->left == curr || prev->right == curr) { // 如果当前节点是根节点或者上一次访问的节点是它的子节点,则将其子节点(如果有)压入中 if (curr->left != NULL) push(&stack, curr->left); else if (curr->right != NULL) push(&stack, curr->right); } else if (curr->left == prev) { // 如果当前节点的左子节点是上一次访问的节点,则将其右子节点(如果有)压入中 if (curr->right != NULL) push(&stack, curr->right); } else { // 否则,输出当前节点的值并弹出顶元素 printf("%d ", curr->val); pop(&stack); } prev = curr; } } ``` 其中,`TreeNode` 表示二叉树节点的结构体,`Stack` 表示的结构体,`push`、`pop`、`isEmpty` 和 `peek` 分别表示入、出、判断是否为空和获取顶元素的函数。在实现时需要注意,因为要输出每个节点的值,所以需要保存上一次访问的节点,用于判断当前节点是其父节点的左子节点还是右子节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值