C语言二叉树链表的建立及四种遍历方法
#include <stdio.h>
#include <stdlib.h>
//定义一个二叉树结构
typedef struct binode
{
char data;
struct binode * lchild;
struct binode * rchild;
}BiTree;
//前序遍历递归法建立二叉树算法
BiTree * CreatBiTree()
{
BiTree *T;
char data;
fflush(stdin);
scanf("%c",&data);
if (data=='$'){ //输入$符号则退出
return;
}
if(data=='#')T=NULL;
else
{
T=(BiTree *)malloc(sizeof(BiTree));
T->data=data;
T->lchild=CreatBiTree();
T->rchild=CreatBiTree();
}
return T;
}
//按层遍历递归二叉树算法
void Layer_order(BiTree * TNode,BiTree ** F,BiTree ** R) //二级指针
{
*F=TNode; //将当前节点放入队列首指针所指位置
printf("%c",(*F)->data);
if((*F)->lchild!=NULL)
{
R=R+1;
*R=(*F)->lchild; //节点的左儿子放入队尾
}
if((*F)->rchild!=NULL)
{
R=R+1; //首指针向后移动一格
*R=(*F)->rchild; //节点的右儿子放入队尾
}
if(F!=R)
{
F=F+1;
Layer_order(*F,F,R);//递归
}
}
//前序遍历递归二叉树算法
void PreOrderTraverse(BiTree *T)
{
if(T==NULL)
return;
printf("%c", T->data); //显示结点数据,可以更改为其他对结点操作
PreOrderTraverse(T->lchild); //再先序遍历左子树
PreOrderTraverse(T->rchild); //最后先序遍历右子树
}
//中序遍历递归二叉树算法
void InOrderTraverse(BiTree *T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild); //中序遍历左子树
printf("%c", T->data); //显示结点数据,可以更改为其他对结点操作
InOrderTraverse(T->rchild); //最后中序遍历右子树
}
//后序遍历递归二叉树的算法
void PostOrderTraverse(BiTree *T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild); //先后序遍历左子树
PostOrderTraverse(T->rchild); //再后续遍历右子树
printf("%c", T->data); //显示结点数据,可以更改为其他对结点操作
}
int main()
{
BiTree ** F; //队首指针 指向指针的指针,因为队列数组里的元素全是指针
BiTree ** R; //队尾指针 二级指针
BiTree * Queue[1024];//队列数组
F=Queue;
R=Queue; //开始时队首队尾指针重合
BiTree * root; //在main函数中建立一个二叉树根的指针
root=CreatBiTree(); //创建树
printf("按层遍历二叉树: \n");
Layer_order(root,F,R); //按层遍历树
printf("\n");
printf("前序遍历二叉树: \n");
PreOrderTraverse(root);
printf("\n");
printf("中序遍历二叉树: \n");
InOrderTraverse(root);
printf("\n");
printf("后序遍历二叉树: \n");
PostOrderTraverse(root);
printf("\n");
return 0;
}
二叉树模型图:
程序执行效果:
输出结果完全正确:
本文来自博客园,作者:IT情深,转载请注明原文链接:https://www.cnblogs.com/wh445306/p/16751783.html