二叉树非递归遍历,主要是使用栈来消除递归。
<pre name="code" class="cpp">void fSortNo(BTP root)前序非递归遍历
{
BTP *s;
BTP p;
int top = -1;
s = (BTP *)malloc(1000 * sizeof(BTP*));
s[++top] = root;
while (top != -1)
{
p = s[top--];
cout << p->data <<" ";
if (p->right)
s[++top] = p->right;
if (p->left)
s[++top] = p->left;
}
free(s);
}
void inOrderNo(BTP root)中序非递归
{
BTP *s;
BTP p;
int top = -1;
int top1 = -1;
p = root;
s = (BTP *)malloc(100 * sizeof(BTP));
do
{
while (p)
{
s[++top] = p;
p = p->left;
}
if (top != -1)
{
p = s[top--];
cout << p->data <<" ";
p = p->right;
}
} while (p || top != -1);
}
前序和中序的非递归遍历都没有什么不好想的地方,只需用栈按照一定的访问顺序储存节点地址,然后出栈,对艮节点进行访问。
后序非递归的思想是用两个栈,因为对根节点的访问要放在右节点之后,所以先对左子树进行遍历,将各节点地址存入栈中,然后对右子树进行访问,将各节点地址存入另一个栈中,然后出栈的时候如果两个栈中都有该节点的地址,则对节点进行访问。
void pOrderNo(BTP root)/后序非递归...
{
BTP *s, *s2;
BTP p;
int top = -1;
int top1 = -1;
int i = 1;
s = (BTP *)malloc(100 * sizeof(BTP));
s2 = (BTP *)malloc(100 * sizeof(BTP));
p = root;
do
{
while (p)
{
s[++top] = p;
p = p->left; //处理左子树
}
while (top != -1&&s2[top1]==s[top])
{
p = s[top--];
cout << p->data <<" ";
top1--;
i++;//控制循环次数
}
if (top!=-1)
{
p = s[top];
s2[++top1] = p ;
p = p->right;//处理右子树
}
} while ((p || top != -1)&&i<10);
}
注: 用来控制循环次数的i:程序中出了一点逻辑问题导致如果缺少这个条件的话会陷入死循环。。。