linux c++ 模板类
*Author: passions_yang 1354001475@qq.com *
讨论范围
本博客只实现二叉树非递归算法的遍历,请自行学习二叉树和模板类等相关知识。代码中附带大量注释,所以就不在进行详细说明。
中序遍历
template <typename T>void Post<T>::NInOrder11(BTNode<T> *t)
{
BTNode<T> *buf[MAXSIZE];
BTNode<T> *p = NULL;
int top = -1;
p = t;
while(top != -1 || p != NULL)//判断栈是否为空
{
while(p != NULL)//判断左子树是否为空
{
buf[++top] = p;//如果不为空,则进栈
p = p->lchild;
}
if(top != -1)//判断栈中是否有元素
{
p = buf[top--];//得到没有左子树为空的父亲节点
cout<<p->data<<" ";//输出当前节点
p = p->rchild;//找当前节点的右子树,将右子树赋给p,再对他进行判断
}
}
}
后序遍历
template <typename T>void Post<T>::NPostOrder11(BTNode<T> *t)
{//{
BTNode<T> *buf[MAXSIZE];
BTNode<T>* p = NULL;
int top = -1;
p = t;
//后续遍历算法
bool flag;//设立标志位,用于判断左子树是否为空
BTNode<T> *q;
do
{
while(p != NULL)//判断左子树是否为空
{
buf[++top] = p;//将左子树全部入栈
p = p->lchild;
}
q = NULL;//这个用于判断右子树是否为NULL
flag = true;//设立标志位,标志左子树已经为空
while(top != -1 && flag == true)//判断栈是否为空,并且左子树已经为空
{
p = buf[top];//将栈中的元素取出来,赋给p,top--不能写到这里
//因为,如果当前节点的右子树与上一次退栈的节点相同时
//我没才需要进行退栈,
if(p->rchild == q)//判断右子树是否为空
{
cout<<p->data<<" ";//打印的是没有左子树和右子树的节点
--top;
q = p;//将上一次打印的节点记录下来
}else
{
p = p->rchild;//将指针下移
flag = false;//将标志位设置为false,意思是左子树不为空
//并且将循环移出,重复do while循环,让他继续判断右子树的左子树是否为空
}
}
} while (top != -1);//判断栈是否为空
}
请仔细阅读,深入理解算法。对于以后将一些递归算法转换为非递归算法,在思想上有很大帮助。在转换上可以使用栈、队列、数组等均可。