/************************************************************************/
/*
!!!回溯法
用回溯法搜索迷宫的所有分支,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());
}