非递归遍历二叉树

来源:互联网 发布:小米盒电视直播软件 编辑:程序博客网 时间:2024/06/09 20:31

前序遍历和中序遍历较简单,都是一直向左遍历,遍历完全后最后元素出栈,向右一步后继续向左遍历直至栈空。
后序遍历的话想了很久,最后想着反向遍历,一直向右遍历,遍历完全后最后元素出栈,向左一步后继续依次向右遍历直至栈空,myList为了控制遍历完全,saveList则是将遍历到的元素全部入栈。
这三个程序也想了很长时间,不过想出来了还是很开心!
因为stack的代码找不到了,就用list代替了。

前序遍历
template
void BinaryTree::Preorder(void(*visit)(Entry&))
{

List<BinaryNode<Entry>*> myList;BinaryNode<Entry> *p = root;while (p || !myList.empty()){    while (p)    {        (*visit)(p->data);        myList.insert(0, p);        p = p->left;    }    //myList.retrieve(0, p);    myList.remove(0, p);    p = p->right;}

}
//中序遍历
template
void BinaryTree::Inorder(void(*visit)(Entry&))
{

List<BinaryNode<Entry>*> myList;BinaryNode<Entry> *p = root;while (p || !myList.empty()){    while (p)    {        myList.insert(0, p);        p = p->left;    }    myList.remove(0, p);    (*visit)(p->data);    p = p->right;}

}
//后序遍历
template
void BinaryTree::Preorder(void(*visit)(Entry&))
{

List<BinaryNode<Entry>*> saveList;List<BinaryNode<Entry>*> myList;BinaryNode<Entry> *p = root;while (p || !myList.empty()){    while (p)    {        saveList.insert(0, p);//将遍历到的指针入栈        myList.insert(0, p);//保证遍历完全        p = p->right;    }    myList.remove(0, p);    p = p->left;}while (!saveList.empty()){    saveList.remove(0, p);    (*visit)(p->data);}

}

0 0
原创粉丝点击