#include "iostream"
#include "stack"
using namespace std;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode;
/*
步骤1:
如果结点有左子树,该结点入栈;
如果结点没有左子树,访问该结点;
步骤2:
如果结点有右子树,重复步骤1;
如果结点没有右子树(结点访问完毕),根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1
如果栈为空,表示遍历结束。
*/
//一直向左走,找到中序遍历的起点
BiTNode * GoLeft(BiTNode * root, stack<BiTNode *> &s)
{
if (root == NULL)
{
return NULL;
}
BiTNode *tmp = NULL;
tmp = root;
while (tmp->lchild != NULL)//如果有左子树
{
s.push(tmp);//入栈
tmp = tmp->lchild;//指向左子树
}
return tmp;
}
void Inorder(BiTNode * root)
{
if (root == NULL)
{
return;
}
BiTNode * tmp = NULL;
stack<BiTNode *> s;
tmp = GoLeft(root, s);
while (tmp)
{
cout << tmp->data << " ";
if (tmp->rchild != NULL)//如果有右枝,则重复步骤一,如果结点有左子树,该结点入栈;如果结点没有左子树,访问该结点;
{
tmp = GoLeft(tmp->rchild, s);
}
else if (!s.empty())//如果没有右枝,并且栈不为空的时候
{
tmp = s.top();
s.pop();
}
else
{
tmp = NULL;
}
}
}
void main()
{
BiTNode t1, t2, t3, t4, t5;
memset(&t1, 0, sizeof(BiTNode));
memset(&t2, 0, sizeof(BiTNode));
memset(&t3, 0, sizeof(BiTNode));
memset(&t4, 0, sizeof(BiTNode));
memset(&t5, 0, sizeof(BiTNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//建立关系
t1.lchild = &t2;
t1.rchild = &t3;
t2.rchild = &t4;
t3.lchild = &t5;
cout << "中序遍历非递归算法:" << endl;
Inorder(&t1);
cout << endl;
system("pause");
}
二叉树中序遍历非递归算法
最新推荐文章于 2022-07-29 15:37:10 发布