前序遍历和中序遍历较简单,都是一直向左遍历,遍历完全后最后元素出栈,向右一步后继续向左遍历直至栈空。
后序遍历的话想了很久,最后想着反向遍历,一直向右遍历,遍历完全后最后元素出栈,向左一步后继续依次向右遍历直至栈空,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);
}
}