码迷,mamicode.com
首页 > 编程语言 > 详细

c语言数据结构:递归的替代-------回溯算法

时间:2015-11-28 06:37:01      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

2.贴代码表现:

先序遍历二叉树:

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);
	}
}
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;                                     //此时,应该访问回溯节点的右节点                                          //弹栈操作
    }
}

  

c语言数据结构:递归的替代-------回溯算法

标签:

原文地址:http://www.cnblogs.com/akiradunn/p/5002105.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!