二叉树遍历源代码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(&S!=NULL ||!IsEmpty(&st))
{
if(S.left !=NULL && bit == false) //bit用来决定是否判断左子
{
Push(&st,S);//入栈
S = *S.left;//结点跳到左子上
bit = false;//此时结点的下个左子未访问过
continue;
{
if(S.right !=NULL) //右子存在则入栈,不存在则不入栈
Push(&st,*S.right);
S= *S.left;//使当前结点到左子上
continue;
}
if(S.right !=NULL)
{
S=*S.right;//没有左子,则使当前结点到右子上
continue;
}
if(!IsEmpty(&st)) //即无左子又无右子,且栈为非空时,出栈
TreeNode e; e.data='e';
TreeNode f; f.data='f';
TreeNode g; g.data='g';
TreeNode h; h.data ='h';
a.left = &b;//给结点的左右子赋值,构建二叉树
a.right = &c;
b.left = &d;
b.right = &e;
}
printf("%c",S.data);//打印当前结点
if(S.right!=NULL)
{
S= *S.right;//结点到右子上
bit = false;//结点到右子上时,下次判断时,左子未被访问过
continue;
}
if(IsEmpty(&st))//如果栈为空,则结束当前函数
{
return;
InitStack(&rightSt);
TreeNode T;
bool leftBit = false;//用来判断左子是否被访问
bool rightBit = false;
while(&S != NULL || !IsEmpty(&leftSt)||!IsEmpty(&rightSt))
{
if(S.left !=NULL && leftBit == false) //左子非空,并且未被访问过
}
S = Pop(&st);//出栈
bit = true;//表示当前结点的左子已被访问过,不在访问
continue;
}
}
void PostOrderF(TreeNode S)
{
stack leftSt;//用来存储判断左子时的当前结点
stack rightSt;//用来存储判断右子时的当前结点
InitStack(&leftSt);
{
S = Pop(&st);//出栈
continue;//结束此次循环,进行下一次循环
}
break;
}
}
void InOrderF(TreeNode S) //非递归中序遍历
{
stack st;
InitStack(&st); //初始化栈
bool bit = false;//bit表示是否已经访问过左子
return;
if(!IsEmpty(&leftSt))//判断左栈是否为空
{
T = *Top(&leftSt).left;//如果左栈中栈顶元素的左子与当前结点相同,则出左栈
if( T.data == S.data)
{
S = Pop(&leftSt);//出栈
rightBit = false;
leftBit = true;
PreOrder(*S.right);//如果当前结点的右子非空,则调用先序遍历函数
}
void InOrder(TreeNode S)
{
if(S.left != NULL)//先判断,左子,中间打印结点
InOrder(*S.left);
printf("%c",S.data);
if(S.right !=NULL)
continue;
}
}
}
}
d.left = NULL;
d.right = &g;
c.left = NULL;
c.right = &f;
g.left =&h;
g.right = NULL;
e.left =NULL;
e.right = NULL;
f.left =NULL;
f.right = NULL;
h.left = NULL;
void InOrderF(TreeNode A);
void PostOrderF(TreeNode A);
TreeNode a; a.data='a';//建立各个结点
TreeNode b; b.data='b';
TreeNode c; c.data='c';
TreeNode d; d.data='d';
}TreeNode;
typedef struct//创建栈
{
TreeNode nd[100];//Node是自定义的结点
int top;//栈顶指针
int size;//栈内元素数量
}stack;
void InitStack(stack *st)//初始化栈
{
st->top=0;
st->size=0;
printf("\n");
}
void PreOrder(TreeNode S)//递归的先序遍历
{
printf("%c",S.data);//打印当前结点
if(S.left != NULL)
PreOrder(*S.left);//如果当前结点的左子非空,则调用先序遍历函数
if(S.right !=NULL)
S= *S.right;
leftBit = false;//新结点的左右子均未被访问
rightBit = false;
continue;
}
printf("%c",S.data);//打印当前结点
if(IsEmpty(&rightSt)&&IsEmpty(&leftSt))//当两个栈均未空时,结束函数
printf("递归遍历\n");
InOrder(a);
printf("\n非递归遍历\n");
InOrderF(a);
printf("\n==========后序遍历==========\n");
printf("递归遍历\n");
PostOrder(a);
printf("\n非递归遍历\n");
PostOrderF(a);
{Βιβλιοθήκη Baidu
if(st->size==0)
{
exit(-1);
}
return st->nd[st->top-1];//返回栈顶元素,只查看
}
bool IsEmpty(stack *st)//判断栈是否为空
{
if(st->size == 0)
return true;
else
return false;
}
void Push(stack *st,TreeNode n)//入栈方法
#include<stdio.h> /*导入需要用到的各种包*/
#include<stdlib.h>
#include<string.h>
typedef struct TreeNode
{//自定义二叉树结点
char data;//当前结点内容
TreeNode *left;//左子树
TreeNode *right;//右子树
{
st->size++;
st->nd[st->top++]=n;
}
int main(void)//主函数
{
void PreOrder(TreeNode A); //声明需要使用的各个函数
void InOrder(TreeNode A);
void PostOrder(TreeNode A);
void PreOrderF(TreeNode A);
}
void PreOrderF(TreeNode S)
{
stack st ;
InitStack(&st);//初始化栈
while(&S!=NULL||!IsEmpty(&st))//当前结点不为空,或者栈非空
{
printf("%c",S.data);
if(S.left != NULL) //有左子,则右子入栈
continue;
}
}
if(!IsEmpty(&rightSt))//右栈非空时进行
{
T = *Top(&rightSt).right;
if(T.data == S.data)//如果右栈栈顶元素的右子与当前结点相同,则出右栈
{
S = Pop(&rightSt);
leftBit = true;
rightBit = true;
h.right =NULL;
printf("==========先序遍历==========\n"); //先序遍历
printf("递归遍历\n");//打印先序遍历
PreOrder(a);//调用方法
printf("\n非递归遍历\n");
PreOrderF(a);
printf("\n==========中序遍历==========\n");
InOrder(*S.right);
}
void PostOrder(TreeNode S)
{
if(S.left != NULL) //先判断左右子,最后打印当前结点
PostOrder(*S.left);
if(S.right !=NULL)
PostOrder(*S.right);
printf("%c",S.data);
}
TreeNode Pop(stack *st)//出栈
{
if (st->size==0) //如果栈为空,则结束程序
{
exit(-1);
}
st->top--;//使栈定指针减1
st->size--;
return st->nd[st->top];
}
TreeNode Top(stack *st)//查看栈顶元素
{
Push(&leftSt,S);//入左栈
S = *S.left;//结点跳到左子上
leftBit = false;
rightBit = false;
continue;
}
if(S.right !=NULL && rightBit == false) //右子非空,并且未被访问过
{
Push(&rightSt,S);//入右栈
{
if(S.left !=NULL && bit == false) //bit用来决定是否判断左子
{
Push(&st,S);//入栈
S = *S.left;//结点跳到左子上
bit = false;//此时结点的下个左子未访问过
continue;
{
if(S.right !=NULL) //右子存在则入栈,不存在则不入栈
Push(&st,*S.right);
S= *S.left;//使当前结点到左子上
continue;
}
if(S.right !=NULL)
{
S=*S.right;//没有左子,则使当前结点到右子上
continue;
}
if(!IsEmpty(&st)) //即无左子又无右子,且栈为非空时,出栈
TreeNode e; e.data='e';
TreeNode f; f.data='f';
TreeNode g; g.data='g';
TreeNode h; h.data ='h';
a.left = &b;//给结点的左右子赋值,构建二叉树
a.right = &c;
b.left = &d;
b.right = &e;
}
printf("%c",S.data);//打印当前结点
if(S.right!=NULL)
{
S= *S.right;//结点到右子上
bit = false;//结点到右子上时,下次判断时,左子未被访问过
continue;
}
if(IsEmpty(&st))//如果栈为空,则结束当前函数
{
return;
InitStack(&rightSt);
TreeNode T;
bool leftBit = false;//用来判断左子是否被访问
bool rightBit = false;
while(&S != NULL || !IsEmpty(&leftSt)||!IsEmpty(&rightSt))
{
if(S.left !=NULL && leftBit == false) //左子非空,并且未被访问过
}
S = Pop(&st);//出栈
bit = true;//表示当前结点的左子已被访问过,不在访问
continue;
}
}
void PostOrderF(TreeNode S)
{
stack leftSt;//用来存储判断左子时的当前结点
stack rightSt;//用来存储判断右子时的当前结点
InitStack(&leftSt);
{
S = Pop(&st);//出栈
continue;//结束此次循环,进行下一次循环
}
break;
}
}
void InOrderF(TreeNode S) //非递归中序遍历
{
stack st;
InitStack(&st); //初始化栈
bool bit = false;//bit表示是否已经访问过左子
return;
if(!IsEmpty(&leftSt))//判断左栈是否为空
{
T = *Top(&leftSt).left;//如果左栈中栈顶元素的左子与当前结点相同,则出左栈
if( T.data == S.data)
{
S = Pop(&leftSt);//出栈
rightBit = false;
leftBit = true;
PreOrder(*S.right);//如果当前结点的右子非空,则调用先序遍历函数
}
void InOrder(TreeNode S)
{
if(S.left != NULL)//先判断,左子,中间打印结点
InOrder(*S.left);
printf("%c",S.data);
if(S.right !=NULL)
continue;
}
}
}
}
d.left = NULL;
d.right = &g;
c.left = NULL;
c.right = &f;
g.left =&h;
g.right = NULL;
e.left =NULL;
e.right = NULL;
f.left =NULL;
f.right = NULL;
h.left = NULL;
void InOrderF(TreeNode A);
void PostOrderF(TreeNode A);
TreeNode a; a.data='a';//建立各个结点
TreeNode b; b.data='b';
TreeNode c; c.data='c';
TreeNode d; d.data='d';
}TreeNode;
typedef struct//创建栈
{
TreeNode nd[100];//Node是自定义的结点
int top;//栈顶指针
int size;//栈内元素数量
}stack;
void InitStack(stack *st)//初始化栈
{
st->top=0;
st->size=0;
printf("\n");
}
void PreOrder(TreeNode S)//递归的先序遍历
{
printf("%c",S.data);//打印当前结点
if(S.left != NULL)
PreOrder(*S.left);//如果当前结点的左子非空,则调用先序遍历函数
if(S.right !=NULL)
S= *S.right;
leftBit = false;//新结点的左右子均未被访问
rightBit = false;
continue;
}
printf("%c",S.data);//打印当前结点
if(IsEmpty(&rightSt)&&IsEmpty(&leftSt))//当两个栈均未空时,结束函数
printf("递归遍历\n");
InOrder(a);
printf("\n非递归遍历\n");
InOrderF(a);
printf("\n==========后序遍历==========\n");
printf("递归遍历\n");
PostOrder(a);
printf("\n非递归遍历\n");
PostOrderF(a);
{Βιβλιοθήκη Baidu
if(st->size==0)
{
exit(-1);
}
return st->nd[st->top-1];//返回栈顶元素,只查看
}
bool IsEmpty(stack *st)//判断栈是否为空
{
if(st->size == 0)
return true;
else
return false;
}
void Push(stack *st,TreeNode n)//入栈方法
#include<stdio.h> /*导入需要用到的各种包*/
#include<stdlib.h>
#include<string.h>
typedef struct TreeNode
{//自定义二叉树结点
char data;//当前结点内容
TreeNode *left;//左子树
TreeNode *right;//右子树
{
st->size++;
st->nd[st->top++]=n;
}
int main(void)//主函数
{
void PreOrder(TreeNode A); //声明需要使用的各个函数
void InOrder(TreeNode A);
void PostOrder(TreeNode A);
void PreOrderF(TreeNode A);
}
void PreOrderF(TreeNode S)
{
stack st ;
InitStack(&st);//初始化栈
while(&S!=NULL||!IsEmpty(&st))//当前结点不为空,或者栈非空
{
printf("%c",S.data);
if(S.left != NULL) //有左子,则右子入栈
continue;
}
}
if(!IsEmpty(&rightSt))//右栈非空时进行
{
T = *Top(&rightSt).right;
if(T.data == S.data)//如果右栈栈顶元素的右子与当前结点相同,则出右栈
{
S = Pop(&rightSt);
leftBit = true;
rightBit = true;
h.right =NULL;
printf("==========先序遍历==========\n"); //先序遍历
printf("递归遍历\n");//打印先序遍历
PreOrder(a);//调用方法
printf("\n非递归遍历\n");
PreOrderF(a);
printf("\n==========中序遍历==========\n");
InOrder(*S.right);
}
void PostOrder(TreeNode S)
{
if(S.left != NULL) //先判断左右子,最后打印当前结点
PostOrder(*S.left);
if(S.right !=NULL)
PostOrder(*S.right);
printf("%c",S.data);
}
TreeNode Pop(stack *st)//出栈
{
if (st->size==0) //如果栈为空,则结束程序
{
exit(-1);
}
st->top--;//使栈定指针减1
st->size--;
return st->nd[st->top];
}
TreeNode Top(stack *st)//查看栈顶元素
{
Push(&leftSt,S);//入左栈
S = *S.left;//结点跳到左子上
leftBit = false;
rightBit = false;
continue;
}
if(S.right !=NULL && rightBit == false) //右子非空,并且未被访问过
{
Push(&rightSt,S);//入右栈