递归算法和非递归算法本质是一样的。
遍历时从根节点开始访问,访问左子树,关键是把树的访问顺序搞清楚。
当遍历完以后又是根节点。
递归函数实际上就是栈的操作。
所谓的先根就是先visit完根节点,然后再遍历左子树,遍历右子树。
template <class T>
void recpretraverse(struct node<T>*&Tree)
{
if(Tree == NULL) return;
visitnode(Tree);
recpretraverse(Tree->left);
recpretraverse(Tree->right);
}
对应的非递归算法就是弹出项,看如果是树,如果右子树存在则压入右子树,左子树存在则压入左子树,最后压入节点(tag域变化)。
看如果是节点,则访问节点。
可以看出需要一个tag域来表示弹出节点还是树。但是前序和中序可以通过别的实现办法避免tag实现。
template <class T>
void pretraverse(struct node<T>*tree)
{
if(tree == NULL) return;
MyStack<struct node<T> *> treestack;
treestack.init(20);
while(tree != NULL|| treestack.gettop()!=0)
{
if(tree!=NULL)
{
treestack.push(tree);
visitnode(tree);
tree = tree->left;
}
else
{
tree = treestack.pop();
tree = tree->right;
}
}
}