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. ContentProvider官方教程(5)ContentResolver插入、更新、删除 示例

    Inserting, Updating, and Deleting Data In the same way that you retrieve data from a provider, you a ...

  2. context是什么意思

    context上下文吗,可以解释为程序运行的某一区间之内,提供对这一区间之内操作的一种对象,而且往往这一区间之内得核心操作都需要这个对象来进行 把Context翻译成“上下文”只是不直观罢了,不过也没 ...

  3. 详细介绍java中的数据结构

    详细介绍java中的数据结构 http://developer.51cto.com/art/201107/273003.htm 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个 ...

  4. C#变量与数据类型

    数据类型: 整型:int short long byte 小数:double float decimal 布尔:bool 字符:char 定义变量: 数据类型 变量名 [= 值]; 变量名的命名规则: ...

  5. iOS深入学习(UITableView:系列1-最基本的东西)

    这是UITableView博客系列的第一篇,使用xib和arc编码,主要讲解一些UITableView使用过程中简单的.但是又容易被忽略的东西,而且我会告诉读者,怎样在使用了之后就再也不会忘记. 操作 ...

  6. Win7 winsock 注册表文件

    http://files.cnblogs.com/xsmhero/Winsock_Win7x64.rar

  7. Cheatsheet: 2014 08.01 ~ 08.31

    Web Slow Server? This is the Flow Chart You're Looking For A Strolll Through Node: Introduction .NET ...

  8. Cheatsheet: 2013 07.21 ~ 07.31

    Mobile Android vs. iOS: Comparing the Development Process of the GQueues Mobile Apps Android Studio ...

  9. mimikatz2.0抓取WINDOWS密码

    看吾爱的,刚好问同事说这个也用过,以后内网渗透的话比较方便 http://www.52pojie.cn/thread-264895-1-1.html ========================= ...

  10. ALV详解:OO SALV

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...