基础算法--递归(二)

 

/************************************************************************/

/*

!!!回溯法

用回溯法搜索迷宫的所有分支,intSecValue为当前所处的路口

*/

/************************************************************************/

int Maze::TravMaze(int intSecValue)

{

//intSecValue>0 为有路径存在,可以继续探索发现一条路径

if(intSecValue > 0)

{

if (intSecValue == Exit)                                                //到达出口

{

cout << intSecValue << " <== ";

return 1;

}

else if (TravMaze(intSec[intSecValue].left))        //向左探索

{

//只有探索成功,即返回值为1,才执行一下语句

cout << intSecValue << " <== ";

return 1;

}

else if (TravMaze(intSec[intSecValue].forward))        //向前探索

{

cout << intSecValue << " <== ";

return 1;

}

else if (TravMaze(intSec[intSecValue].right))        //向右探索

{

cout << intSecValue << " <== ";

return 1;

}

}

return 0;

}

 

树中的应用:

 

/***************************************************************************

 

!!!!!! 后跟遍历递归算法

2两种下面的和后面的后根遍历

//删除以t为根结点的子树

****************************************************************************/

template<class T>

void Tree<T>::DeleteSubTree(TreeNode<T> * &t)

{

if( t == NULL)        return;

TreeNode<T> *q = t->FirstChild();

TreeNode<T> *p;

while( q != NULL)

{

p = q->NextSibling();

DeleteSubTree(q);

q = p;

}

 

/*cout<<t->GetData()<<" ";*/

delete t;

}

 

/***************************************************************************

 

!!!!!! 用回溯法实现

在树root中查找结点s的双亲结点

****************************************************************************/

template<class T>

TreeNode<T> * Tree<T>::SerchParent(TreeNode<T>* &root, TreeNode<T>* &s)

{

if( root == NULL) return NULL;

if ( root->FirstChild() == s || root->NextSibling() == s) return root;

 

TreeNode<T> * p;

if( p = SerchParent(root->FirstChild(), s) != NULL) return p;

if( p = SerchParent(root->NextSibling(), s) != NULL) return p;

return NULL;

}

 

/***************************************************************************

 

!!!!!! 先根遍历递归算法

!!!!!! 后根遍历递归算法

 

****************************************************************************/

template<class T>

void Tree<T>::PreOrderTree(TreeNode<T> * &t)

{

if( t == NULL) return;

 

 

cout << t->GetData() << " ";

 

if( t->FirstChild() != NULL) PreOrderTree(t->FirstChild());

 

if( t->NextSibling() != NULL) PreOrderTree(t->NextSibling());

}

 

template<class T>

void Tree<T>::PostOrderTree(TreeNode<T> * &t)

{

if( t == NULL) return;

 

 

if( t->FirstChild() != NULL) PostOrderTree(t->FirstChild());

 

cout << t->GetData() << " ";

 

if( t->NextSibling() != NULL) PostOrderTree(t->NextSibling());

 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值