c语言数据结构:递归的替代-------回溯算法
1.要理解回溯就必须清楚递归的定义和过程。
递归算法的非递归形式可采用回溯算法。主要考虑的问题在于:
- 怎样算完整的一轮操作。
- 执行的操作过程中怎样保存当前的状态以确保以后回溯访问。
- 怎样返回至上一次未执行的操作。
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语言数据结构:递归的替代-------回溯算法的更多相关文章
- C语言数据结构----递归的应用(八皇后问题的具体流程)
本节主要讲八皇后问题的基本规则和递归回溯算法的实现以及具体的代码实现和代码分析. 转载请注明出处.http://write.blog.csdn.net/postedit/10813257 一.八皇后问 ...
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
- Java求解迷宫问题:栈与回溯算法
摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1) 选择一个 ...
- C#数据结构与算法系列(十四):递归——八皇后问题(回溯算法)
1.介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的经典案例,该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即 任意两个皇后都不能处 ...
- 3、回溯算法解题套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化
上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...
- 回溯算法-C#语言解决八皇后问题的写法与优化
结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...
- C语言回溯算法解决N皇后问题
回溯算法的模型是 x++, not satisfy ? x-- : continue. 代码中x作列号,y[x]保存第x列上皇后放置的位置. #include<stdio.h> #incl ...
随机推荐
- js取当前项目名称
function getContextPath(){ var path = window.location.href; path = path.substring(0, path.lastIndexO ...
- enc
enc [问题背景] zhx 和他的妹子聊天. [问题描述] 考虑一种简单的加密算法. 假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则: a-> ...
- Intent官方教程(4)用Intent构造应用选择框
Forcing an app chooser When there is more than one app that responds to your implicit intent, the us ...
- MFC之简单计算器
1.界面 2.变量 combobox的变量类型是CComBoBox类型,三个输入框是double类型: 它的type是Drop List 3.代码 (1).初始化combobox BOOL Ccalc ...
- 数据库SQL语句练习题5--9
5. 查询Score表中成绩为85,86或88的记录. ,,) 6. 查询Student表中“95031”班或性别为“女”的同学记录. ' or ssex = '女' 7. 以Class降序查询Stu ...
- 2012 #5 Gold miner
Gold miner Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- VPython—旋转坐标系
使用arrow( )创建三个坐标轴代表一个坐标系,其中X0-Y0-Z0为参考坐标系(固定不动),X-Y-Z为运动坐标系,这两个坐标系原点重合,运动坐标系可以绕参考坐标系或其自身旋转.在屏幕上输出一个转 ...
- session 登陆浏览,并实现session注销登陆
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Beaglebone Black–GPIO 高低电平控制 LED 灯
上一篇,运用 Linux 的 sysfs,控制本机上的 LED 灯,usr0 至 usr3,这次用 GPIO 控制外部的电路,点亮 LED 灯. 这次的全部材料: BBB 一台 购买 BBB 自带的 ...
- 详解 ASP.NET异步
在前文中,介绍了.NET下的多种异步的形式,在WEB程序中,天生就是多线程的,因此使用异步应该更为谨慎.本文将着重展开ASP.NET中的异步. [注意]本文中提到的异步指的是服务器端异步,而非客户端异 ...