1.要理解回溯就必须清楚递归的定义和过程。

递归算法的非递归形式可采用回溯算法。主要考虑的问题在于:

  1. 怎样算完整的一轮操作。
  2. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问。
  3. 怎样返回至上一次未执行的操作。

2.贴代码表现:

先序遍历二叉树:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stackar.h"
#include "fatal.h"
char U[100];
typedef struct TreeNode {
ElementType Element;
struct TreeNode *Left;
struct TreeNode *Right;
} BTNode;
BTNode *FindNode(BTNode *b,ElementType x)
{
//在二叉树中查找值为x的结点
BTNode *p;
if (b==NULL) return NULL;
else if (b->Element==x) return b;
else
{
p=FindNode(b->Left,x);
if (p!=NULL) return p;
else return FindNode(b->Right,x);
}
}
BTNode *CreateTree(BTNode *root)
{
//先序递归创建二叉树,
//输入范例:abd#g##e##cf#h###
//对应于: a(b(d(,g),e),c(f(,h),))
char ch;
scanf("%c",&ch);
if(ch=='#') {
//printf("--%c$$$\n",ch);
return NULL;
}
else
{
//printf("++%c***\n",ch);
root=(BTNode *)malloc(sizeof(BTNode));
root->Element=ch;
root->Left=CreateTree(root->Left);
root->Right=CreateTree(root->Right);
}
return root;
}
int pd(BTNode *b)
{
if(b->Left==NULL&&b->Right==NULL)
return 0;
if(b->Left!=NULL&&b->Right==NULL)
return 1;
if(b->Left==NULL&&b->Right!=NULL)
return 2;
if(b->Left!=NULL&&b->Right!=NULL)
return 3;
}
void prev(BTNode *b)
{
BTNode *f=b;
int i,j;
U[0]='|';
i=1;
for(;;)
{
for(;;)
{
j=0;
printf("%c",f->Element);
switch(pd(f))
{
case 0: { //当一个节点为叶子结点的时候开始回溯
j=1;break;
}
case 1:{
f=f->Left;break; //当一个节点有左孩子无右孩子的时候访问左孩子
}
case 2:{
f=f->Right;break; //当一个节点有右孩子无左孩子的时候访问右孩子
}
case 3:{
U[i++]=f->Element; //当一个节点有左孩子又有右孩子时存入节点的值
f=f->Left;break; //至字符数组U,以便以后回溯访问上一级。与此同时继续访问左孩子
} }
if(j==1)
break;
}
f=FindNode(b,U[i-1]); //根据U中最近保存的字符找出在原二叉树中相应的结点
if(--i==0)
break;
f=f->Right; //此时,应该访问回溯节点的右节点 //弹栈操作
}
}
void main()
{
BTNode *T,*p;
T=CreateTree(p);
prev(T); }

  

  

c语言数据结构:递归的替代-------回溯算法的更多相关文章

  1. C语言数据结构----递归的应用(八皇后问题的具体流程)

    本节主要讲八皇后问题的基本规则和递归回溯算法的实现以及具体的代码实现和代码分析. 转载请注明出处.http://write.blog.csdn.net/postedit/10813257 一.八皇后问 ...

  2. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  3. Java求解迷宫问题:栈与回溯算法

    摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1)  选择一个 ...

  4. C#数据结构与算法系列(十四):递归——八皇后问题(回溯算法)

    1.介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的经典案例,该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即 任意两个皇后都不能处 ...

  5. 3、回溯算法解题套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  6. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  7. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  8. 回溯算法-C#语言解决八皇后问题的写法与优化

    结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...

  9. C语言回溯算法解决N皇后问题

    回溯算法的模型是 x++, not satisfy ? x-- : continue. 代码中x作列号,y[x]保存第x列上皇后放置的位置. #include<stdio.h> #incl ...

随机推荐

  1. C# 发送邮件代码

    C# 发送邮件代码 MailMessage mailMsg = new MailMessage(); //using System.Net; 引用 mailMsg.From = new MailAdd ...

  2. Storm系列之一——Storm Topology并发

    1.是什么构成一个可运行的topology? worker processes(worker进程),executors(线程)和tasks. 一台Storm集群里面的机器可能运行一个或多个worker ...

  3. 使用StarUML创建类图

    使用StarUML创建类图 http://www.flyne.org/article/379 1.综述(What) StarUML是一种生成类图和其他类型的UML图表的工具.本文是一个使用StarUM ...

  4. 11个让你吃惊的 Linux 终端命令

    原文:http://linux.about.com/od/commands/tp/11-Linux-Terminal-Commands-That-Will-Rock-Your-World.htm 作者 ...

  5. 关于打开MTK_SDCARD_SWAP 宏后MTK目前升级方案和 关于打开MTK_SHARED_SDCARD宏后MTK目前升级方案

    如果设置宏MTK_SDCARD_SWAP=yes:默认是优先从外卡获取升级包,外卡没有包,才会去内卡获取!   1.插入外卡,升级包update.zip放入外卡,升级可以成功!   2.插入外卡,升级 ...

  6. 主框架搭建demo

    - (void)viewDidLoad {     [super viewDidLoad];        [self setUpAllChildViewController]; }    /**   ...

  7. Eclipse中没有andriod问题解决方法

    按照网上教程<andriod+环境搭建_图文版>进行安装android,结果,在eclipse中window->preference下找不到"Android"选项 ...

  8. LeetCode-Repeated DNA

    关于位操作符.如<<, value << num ,其中,num指定要位移值value移动的位数,每左移一个位,高阶位都被移出(直接丢掉),并用0填充右边.. 道理明明很简单啊 ...

  9. CALayer总结(一)

    1.geometryFlipped   设置为yes,则子图层或者子视图本来相对于左上角放置 改为 相对于左下角放置: 2.contents 3.contentGravity: kCAGravityC ...

  10. hdu 1247 map的使用

    http://acm.hdu.edu.cn/showproblem.php?pid=1247 Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    ...