#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
typedef struct BiNode
{
struct BiNode* lNode;
struct BiNode* rNode;
int data;
}*BiTree;
void createTree(BiTree &T)
{
int data;
scanf("%d", &data);
if (data == 0)
{
T = NULL;
return;
}
T = (BiTree)malloc(sizeof(struct BiNode));
T->lNode = NULL;
T->rNode = NULL;
T->data = data;
createTree(T->lNode);
createTree(T->rNode);
}
void preOrder(BiTree T)
{
if (T == NULL)
{
return;
}
printf("%d ", T->data);
preOrder(T->lNode);
preOrder(T->rNode);
}
void inOrder(BiTree T)
{
if (T == NULL)
{
return;
}
inOrder(T->lNode);
printf("%d ", T->data);
inOrder(T->rNode);
}
void postOrder(BiTree T)
{
if (T == NULL)
{
return;
}
postOrder(T->lNode);
postOrder(T->rNode);
printf("%d ", T->data);
}
void levelOrder(BiTree T)
{
BiNode* p;
queue<BiNode*> Q;
Q.push(T);
while (!Q.empty())
{
p = Q.front();
Q.pop();
printf("%d ", p->data);
if (p->lNode)
Q.push(p->lNode);
if (p->rNode)
Q.push(p->rNode);
}
}
/*前序非递归遍历树*/
void preOrderTree(BiTree T)
{
stack<BiNode*> S;
BiNode* p = T;
while (p!=NULL || !S.empty())
{
while (p != NULL)
{
printf("%d ", p->data);
S.push(p);
p = p->lNode;
}
if (!S.empty())
{
p = S.top();
S.pop();
p = p->rNode;
}
}
}
/*中序非递归遍历树*/
void inorderTree(BiTree T)
{
stack<BiNode*> S;
BiNode* p = T;
while (p!=NULL || !S.empty())
{
/*左子树全部入栈*/
while (p != NULL)
{
S.push(p);
p = p->lNode;
}
if (!S.empty())
{
p = S.top();
S.pop();
printf("%d ", p->data);
p = p->rNode;
}
}
}
/*后序非递归遍历树*/
void postOrderTree(BiTree T)
{
stack<BiNode*> S;
BiNode* p = T;
BiNode* q = NULL;
while (p!=NULL || !S.empty())
{
/*左子树全部入栈*/
while (p != NULL)
{
S.push(p);
p = p->lNode;
}
if (!S.empty())
{
p = S.top();
if (p->rNode==NULL || (p->rNode==q))
{
printf("%d ", p->data);
q = p;
S.pop();
p = NULL; /*这个地方要置为空,否则会死循环*/
}
else
p = p->rNode;
}
}
}
int main()
{
#if 1
BiTree T = NULL;
createTree(T);
printf("前序:\n");
preOrder(T);
printf("\n非递归前序:\n");
preOrderTree(T);
printf("\n中序:\n");
inOrder(T);
printf("\n非递归中序\n");
inorderTree(T);
printf("\n后序:\n");
postOrder(T);
printf("\n非递归后序\n");
postOrderTree(T);
printf("\n层序:\n");
levelOrder(T);
printf("\n");
#endif
return 0;
}
树的递归和非递归遍历
最新推荐文章于 2022-09-12 19:15:37 发布