#include <stdio.h>
#include <stdlib.h>
#define TYPE char
struct Bitree{
TYPE data;
struct Bitree *lchild, *rchild;
};
//创建一颗二叉树
Bitree *create(Bitree *T){
TYPE data; //当前节点的值
printf("请输入当前节点的值: data= ");
scanf("%c", &data);
getchar();
if(data != '#'){
T = (Bitree *)malloc(sizeof(Bitree *));
T -> data = data;
T -> lchild = NULL;
T -> rchild = NULL;
T -> lchild = create(T -> lchild);
T -> rchild = create(T -> rchild);
}
return T;
}
//先序遍历
void preOrder(Bitree *T){
if(T!=NULL){
printf("%c", T ->data);
preOrder(T -> lchild);
preOrder(T -> rchild);
}
//先序遍历(非递归)
void preOrder(BiTree *T){
InitStack(S); BiTree p = T;
while(p || IsEmpty(S)){
if(p){ //一路向左
Visit(p); push(S,p); //入栈
p = p -> lchild;
}
else{
Pop(S,p);
p = p -> rchild;//如果有则跟以前套路一样遍历
}
}
}
}
//中序遍历
void inOrder(Bitree *T){
if(T!=NULL){
inOrder(T -> lchild);
printf("%c", T ->data);
inOrder(T -> rchild);
}
}
//中序遍历(非递归)
void inOrder(BiTree *T){
InitStack(S); BiTree p = T;
while(p || IsEmpty(S)){
if(p){ //一路向左
push(S,p); //入栈
p = p -> lchild;
}
else{
Pop(S,p); Visit(p);
p = p -> rchild;//如果有则跟以前套路一样遍历
}
}
}
//后序遍历
void postOrder(Bitree *T){
if(T!=NULL)
{
postOrder(T -> lchild);
postOrder(T -> rchild);
printf("%c", T ->data);
}
//非递归后序遍历
void PostOrder(BiTree T){
InitStack(S);
BiTNode *p = T;
BiTNode *r = NULL;
//利用的栈
while(p || !IsEmpty(S)){
if(p){ //走到最左边
push(S,p);
p = p -> lchild;
}
else{
GetTop(S,p); //这个点已经没有了左子树,就看一下有没有右子树就行
if(p -> rchild && p -> rchild != r)//若右子树存在,且未被访问过
p = p -> rchild
else{
pop(S,p);//弹出
visit(p -> data); //没有被访问过且左右都无
r = p;
p = NULL;
}
}
}
}
}
//层次遍历
void LevelOrder(BiTree T){
InitQueue(Q); //利用队列啦、
BiTree p;
EnQueue(Q,T);
while(!IsEmptt(Q)){
DeQueue(Q,p);//对头结点出队
visit(p); //出去前访问看看两边有没有,有的话入队
if(p -> lchild != NULL)
EnQueue(Q,p -> lchild);
if(p ->rchild != NULL)
EnQueue(Q, p -> rchild);
}
}
int main(){
Bitree *T = (Bitree *)malloc(sizeof(Bitree *));;
T = create(T);
inOrder(T);
return 0;
}
二叉树遍历代码--先中后层次
最新推荐文章于 2024-08-23 17:02:54 发布