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. linux硬盘分区格式化及挂载

    1.硬盘的接口类型 硬盘的接口一般分为两种,一种是IDE并行接口,一种是SATA串行接口, 在linux上面IDE接口的硬盘被识别为/dev/hd[a-z]这样的设备,其中hdc表示光驱设备,这是因为 ...

  2. C语言培训第一天

    下面是一些命令,先来谈谈今天的若干收获吧! 计算机中的一切文件都是以二进制补码的形式存在,问题也就来了. 第一个问题 如果我们给一个无符号的数赋值一个负数,他会读取到什么,又会输出什么?(似乎问题和上 ...

  3. Struts2的标签库(一)——使用Struts2的标签库

    Struts2的标签库(一) --使用Struts2的标签库 1.Struts2的标签库其实就是一个自定义的标签库,所以它也有它的标签处理类和标签库定义文件: 2.和所有自定义标签一样,我们可以找到S ...

  4. C#支持文件拖拽

    private void listBox1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataForm ...

  5. 《安全智库》:48H急速夺旗大战通关writeup(通关策略)

    作者:ByStudent   题目名字 题目分值 地址 MallBuilder2 350 mall.anquanbao.com.cn MallBuilder1 200 mall.anquanbao.c ...

  6. 多线程处理sql server2008出现Transaction (Process ID) was deadlocked on lock resources with another process and has been chose问题

    多线程处理sql server2008某个表中的数据时,在Update记录的时候出现了[Transaction (Process ID 146) was deadlocked on lock reso ...

  7. ManualResetEvent & AutoResetEvent

      参考资料: 1. https://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx 2. https: ...

  8. C++指针内存

    这是一个关于C++指针的问题,思考了一下 void GetMemory(char *p, int num){ p = (char*) malloc (sizeof(char) * num); } vo ...

  9. Codeforces Round #198 (Div. 2)

    A.The Wall 题意:两个人粉刷墙壁,甲从粉刷标号为x,2x,3x...的小块乙粉刷标号为y,2y,3y...的小块问在某个区间内被重复粉刷的小块的个数. 分析:求出x和y的最小公倍数,然后做一 ...

  10. iOS - OC SingleClass 单例类

    前言 单例对象能够被整个程序所操作.对于一个单例类,无论初始化单例对象多少次,也只能有一个单例对象存在,并且该对象是全局的,能够被整个系统访问到. 特点: 在内存中只有一个实例 提供一个全局的访问点 ...