利用栈实现,我这里是为了方便用了c++的stack。
定义树的结构体
typedef struct BiTNode{
char data;
BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
先序遍历
先将左子树入栈,边入栈遍输出值,左子树入完后入右子树,再重复之前操作。
</pre><p><pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp">void PreOrder(BiTree T) //先序遍历的非递归
{
if (!T)
{
return ;
}
stack<BiTree> s;
while (T) // 左子树上的节点全部压入到栈中
{
s.push(T);
<pre name = "code" class = "cpp"><span style = "white-space:pre"> < / span > printf("%d ", temp->data);
T = T->lchild;
}
while (!s.empty())
{
BiTree temp = s.top()->rchild;
{
printf("%d ", temp->data);
s.push(temp);
temp = temp->lchild;
}
}
}
中序遍历
先入栈左子树,再输出值,把栈顶的元素提出,访问它的右子树,再重复前面操作。
void InOrderTraverse1(BiTree T) // 中序遍历的非递归
{
if(!T)
return ;
BiTree bt = T; // 指向当前要检查的节点
stack<BiTree> s;
while(bt != NULL || !s.empty())
{
while(bt != NULL)
{
s.push(bt);
bt = bt->lchild;
}
if(!s.empty())
{
bt = s.top();
s.pop();
printf("%d ",bt->data;
bt = bt->rchild;
}
}
}
后序遍历
void PostOrder_Nonrecursive1(BiTree T)
{
stack<BiTree> S;
BiTree curr = T ; // 指向当前要检查的节点
BiTree previsited = NULL; // 指向前一个被访问的节点
while(curr != NULL || !S.empty()) // 栈空时结束
{
while(curr != NULL) // 一直向左走直到为空
{
S.push(curr);
curr = curr->lchild;
}
curr = S.top();
// 当前节点的右孩子如果为空或者已经被访问,则访问当前节点
if(curr->rchild == NULL || curr->rchild == previsited)
{
cout<<curr->data<<" ";
previsited = curr;
S.pop();
curr = NULL;
}
else
curr = curr->rchild; // 否则访问右孩子
}
}