#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 30
typedef struct node
{
char data;
struct node* lchild, * rchild;
}BSTree;
void Preorder(BSTree* p)//先序遍历
{
BSTree* stack[MAXSIZE];
int i = 0;
stack[0] = NULL;
while (p!=NULL||i>0)
{
if (p != NULL)
{
printf("%3c", p->data);
stack[++i] = p;
p = p->lchild;
}
else
{
p = stack[i--];
p = p->rchild;
}
}
}
void Inorder(BSTree* p)//中序遍历
{
BSTree* stack[MAXSIZE];
int i = 0;
stack[0] = NULL;
while (i>=0)
{
if (p!=NULL)
{
stack[++i] = p;
p = p->lchild;
}
else
{
p = stack[i--];
printf("%3c", p->data);
p = p->rchild;
}
if (p==NULL&&i==0)
{
break;
}
}
}
void Inorder2(BSTree* p)//中序遍历
{
BSTree* stack[MAXSIZE];
int i = 0;
stack[0] = NULL;
while (p!=NULL||i>0)
{
if (p != NULL)
{
stack[++i] = p;
p = p->lchild;
}
else
{
p = stack[i--];
printf("%3c", p->data);
p = p->rchild;
}
}
}
void Postorder(BSTree* p)//后序遍历
{
BSTree* stack[MAXSIZE];
int i = 0,b[MAXSIZE];
stack[0] = NULL;
while (p != NULL || i > 0)
{
if (p!=NULL)
{
stack[++i] = p;
b[i] = 0;
p = p->lchild;
}
else
{
p = stack[i--];
if (!b[i+1])
{
stack[++i] = p;
p = p->rchild;
b[i] = 1;
}
else
{
printf("%3c", p->data);
p = NULL;
}
}
}
}
BSTree* Createb(BSTree** p)//创建二叉树
{
char ch;
scanf_s("%c", &ch);
if (ch != '.')
{
(*p) = (BSTree*)malloc(sizeof(BSTree));
(*p)->data = ch;
(*p)->lchild = Createb(&(*p)->lchild);
(*p)->rchild = Createb(&(*p)->rchild);
}
else
{
*p = NULL;
}
return *p;
}
void main(void)
{
BSTree* root;
printf("输入二叉树\n");
Createb(&root);
Preorder(root);
printf("\n");
Inorder(root);
printf("\n");
Inorder2(root);
printf("\n");
Postorder(root);
printf("\n");
}
二叉树的非递归遍历
最新推荐文章于 2024-10-10 15:26:55 发布