#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
/*非递归方法前序遍历二叉树,利用辅助栈(指针数组实现)。由于对指针不是很熟悉,代码较为混乱,基本上实现遍历的功能。
主要练习对结构体指针与链表的使用。*/
typedef struct tree{
int key;
struct tree *left;
struct tree *right;
}*BiTree,Node;
BiTree *temp[100]={NULL};//存放当前根节点的指针
int flag=-1;//保存当前栈顶位置
//循环创建二叉树
void CreateBiTree(BiTree &T)/*DEVC++无法编译此句话,需要从vs中运行*/
{
int word;
scanf("%d",&word);//输入的节点值
if(word==-1)//-1表示该节点下面没有左右孩子
{
T=NULL;
}
else
{ //生成当前的根节点
Node *p=(Node *) malloc (sizeof(Node));//开辟新的节点
T=p;
T->key=word;
CreateBiTree(T->left);//递归建立左子树
CreateBiTree(T->right); //递归建立右子树
}
}
int isEmpty()//判断栈是否为空
{
if(flag==-1)
return 1;
return 0;
}
void push(BiTree &T)//节点入栈
{
flag++;
BiTree *p=&T;
temp[flag]=p;
}
BiTree *pop()//节点出栈
{
BiTree t=*temp[flag];
flag--;
return &t;
}
void NonRecOrder(BiTree &T)//非递归前序遍历
{
BiTree t;//临时节点
push(T);//当前根节点入栈
while(!isEmpty())//栈不为空则循环继续
{
t=*pop();//取出当前栈顶节点
printf("%d ",t->key);//获取节点值
if(t->left&&!(t->right))//当只有左孩子时,将左孩子入栈,并向下继续搜索
{
push(t->left);
t=t->left;
}
else if(t->right&&!(t->left))//当只有右孩子时,将右孩子入栈,并继续向下搜索
{
push(t->right);
t=t->right;
}
else if(t->right&&t->left)//两个孩子都有的情况先将右孩子入栈,再将左孩子入栈,并继续向左孩子搜索
{
push(t->right);
push(t->left);
t->left;
}
}
}
void PreOrder(BiTree &T) //递归先序遍历以T为根的二叉树
{
if(T)//T不为空或者根时
{
printf("%d ",T->key);//打印当前节点
PreOrder(T->left);
PreOrder(T->right);
}
}
int main(int argc, char *argv[])
{
BiTree T;
printf("请依次输入1,2,-1,3,4,-1,-1,-1,5,-1,6,-1,-1\n其中-1代表前面的节点没有左孩子或者右孩子\n");
CreateBiTree(T);
printf("递归法先序遍历的顺序是\n");
PreOrder(T);
printf("\n非递归先序遍历的顺序是\n");
NonRecOrder(T);
system("PAUSE");
return 0;
}
数据结构--非递归遍历二叉树(利用辅助栈)
最新推荐文章于 2021-03-07 23:16:20 发布