非递归中序遍历二叉树
遍历思想:
//找到最左边的节点
BiTNode * GetLeftLeaf(BiTNode *T, stack<BiTNode *> &m_stack)
{
if (!T)
{
return NULL;
}
while (T->lchild)
{
m_stack.push(T);
T = T->lchild;
}
return T;
}
//非递归中序遍历
void inPrint(BiTNode *T)
{
stack<BiTNode *>m_stack;
if (!T)
{
return;
}
cout << "非递归遍历:";
BiTNode *t = GetLeftLeaf(T,m_stack);
while (t)
{
cout << t->data << " ";
if (t->rchild)
{
t = GetLeftLeaf(t->rchild, m_stack);
}
else if (!m_stack.empty())
{
t = m_stack.top();
m_stack.pop();
}
else
{
t = NULL;
}
}
}
void main()
{
BiTNode b1, b2, b3, b4, b5;
memset(&b1, 0, sizeof(BiTNode));
memset(&b2, 0, sizeof(BiTNode));
memset(&b3, 0, sizeof(BiTNode));
memset(&b4, 0, sizeof(BiTNode));
memset(&b5, 0, sizeof(BiTNode));
b1.data = 1;
b2.data = 2;
b3.data = 3;
b4.data = 4;
b5.data = 5;
/*
1
2 3
4 5
*/
//构建树关系
b1.lchild = &b2;
b1.rchild = &b3;
b2.lchild = &b4;
b3.lchild = &b5;
printf("\n递归中序遍历");
InOrder(&b1);
cout << "\n非递归遍历:";
inPrint(&b1);
cout << endl;
system("pause");
}
结果;