递归算法和非递归算法本质是一样的。
遍历时从根节点开始访问,访问左子树,关键是把树的访问顺序搞清楚。
当遍历完以后又是根节点。

递归函数实际上就是栈的操作。
所谓的先根就是先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;

        }
    }

}






Posted on 2008-06-05 22:20 micheal's tech 阅读(921) 评论(0)  编辑 收藏 引用 所属分类: Algorithm

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理