1、先序遍历非递归
template<class ElemType>
void NonRecurPreOrder(const BinaryTree<ElemType>& bt, void(*visit)(const ElemType&))
{
const BinTreeNode<ElemType>* cur = bt.GetRoot();
LinkStack<const BinTreeNode<ElemType>*>s;
while (cur != NULL)
{
(*visit)(cur->data);
s.Push(cur);
if (cur->leftChild != NULL)
{
cur = cur->leftChild;
}
else if (!s.Empty())
{
while (!s.Empty())
{
s.Pop(cur);
cur = cur->rightChild;
if (cur != NULL) break;
}
}
else
{
cur = NULL;
}
}
}
2、中序遍历非递归
2.1、搜索某节点的最左侧节点
template<class ElemType>
const BinTreeNode<ElemType>* GoFarLeft(const BinTreeNode<ElemType>* r, LinkStack<const BinTreeNode<ElemType>*>& s)
{
if (r == NULL)
{
return NULL;
}
else
{
const BinTreeNode<ElemType>* cur = r;
while (cur->leftChild != NULL)
{
s.Push(cur);
cur = cur->leftChild;
}
return cur;
}
}
2.2、中序遍历非递归代码
template<class ElemType>
void NonRecurInOrder(const BinaryTree<ElemType>& bt, void (*visit)(const ElemType&))
{
const BinTreeNode<ElemType>* cur;
LinkStack<const BinTreeNode<ElemType>*>s;
cur = GoFarLeft<ElemType>(bt.GetRoot(), s);
while (cur!=NULL)
{
(*visit)(cur->data);
if (cur->rightChild != NULL)
{
cur = GoFarLeft(cur->rightChild, s);
}
else if (!s.Empty())
{
s.Pop(cur);
}
else
{
cur = NULL;
}
}
}
3、后序遍历非递归
3.1、修改后的节点结构
template<class ElemType>
struct ModiNode
{
const BinTreeNode<ElemType>* node;
bool rightSubTreeVisited;
};
3.2、搜索某节点的最左侧节点
template<class ElemType>
ModiNode<ElemType>* GoFarLeft(const BinTreeNode<ElemType>* r, LinkStack<ModiNode<ElemType>*>& s)
{
if (r == NULL)
{
return NULL;
}
else
{
const BinTreeNode<ElemType>* cur = r;
ModiNode<ElemType>* newPtr;
while (cur->leftChild!=NULL)
{
newPtr = new ModiNode<ElemType>;
newPtr->node = cur;
newPtr->rightSubTreeVisited = false;
s.Push(newPtr);
cur = cur->leftChild;
}
newPtr = new ModiNode<ElemType>;
newPtr->node = cur;
newPtr->rightSubTreeVisited = false;
return newPtr;
}
}
3.3、后序遍历非递归代码
template<class ElemType>
void NonRecurPostOrder(const BinaryTree<ElemType>& bt, void (*visit)(const ElemType&))
{
ModiNode<ElemType>* cur;
LinkStack<ModiNode<ElemType>*>s;
cur = GoFarLeft<ElemType>(bt.GetRoot(), s);
while (cur!=NULL)
{
if (cur->node->rightChild == NULL || cur->rightSubTreeVisited)
{
(*visit)(cur->node->data);
delete cur;
if (!s.Empty())
{
s.Pop(cur);
}
else
{
cur = NULL;
}
}
else
{
cur->rightSubTreeVisited = true;
s.Push(cur);
cur = GoFarLeft<ElemType>(cur->node->rightChild, s);
}
}
}