二叉树的基本操作<1>-----四种遍历

//二叉树的操作实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef char TreeNodeType;
//二叉树结点结构体
typedef struct TreeNode{
TreeNodeType data;
struct TreeNode* lchild;
struct TreeNode* rchild;
}TreeNode;


//队列结构体
typedef struct queue{
int cur;
TreeNode arr[100];
int size;
}Queue;


//二叉树结点的创建
TreeNode* CreatTreeNode(TreeNodeType value){
TreeNode* new = (TreeNode*)malloc(sizeof(TreeNode));
new->data = value;
new->lchild = NULL;
new->rchild = NULL;
return new;
}


//二叉树的遍历
//方式一:先序遍历
//原理:基于二叉树的递归构造,其遍历也可以采取递归的方式,先序遍历<先访问本身结点,再访问左子树,
//最后访问右子树>
void PreOrder(TreeNode* root){
if(root == NULL){
//空树
return;
}
printf("%c ",root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}


//先序遍历的检测函数
void textPreOrder(){
//创建二叉树
printf("\n*************%s********************\n",__FUNCTION__);
TreeNode* A = CreatTreeNode('a');
TreeNode* B = CreatTreeNode('b');
TreeNode* C = CreatTreeNode('c');
TreeNode* D = CreatTreeNode('d');
A->lchild = B;
A->rchild = C;
B->lchild = D;
PreOrder(A);
printf("\n");
return;
}


//方式二;中序遍历
//原理:同先序遍历,只是访问顺序有所差异,中序遍历<先访问左子树,再访问本身结点,最后访问右子树>
void InOrder(TreeNode* root){
if(root == NULL){
//空树
return;
}
InOrder(root->lchild);
printf("%c ",root->data);
InOrder(root->rchild);
}


//中序遍历的检测函数
void textInOrder(){
//创建二叉树
printf("\n*************%s********************\n",__FUNCTION__);
TreeNode* A = CreatTreeNode('a');
TreeNode* B = CreatTreeNode('b');
TreeNode* C = CreatTreeNode('c');
TreeNode* D = CreatTreeNode('d');
A->lchild = B;
A->rchild = C;
B->lchild = D;
InOrder(A);
printf("\n");
return;
}


//方式三:后序遍历
//原理:同先序遍历,只是访问顺序有所差异,后序遍历<先访问左子树,再访问右子树,最后访问本身结点>
void PostOrder(TreeNode* root){
if(root == NULL){
//空树
return;
}
PostOrder(root->lchild);
PostOrder(root->rchild);
printf("%c ",root->data);
}


//后序遍历的检测函数
void textPostOrder(){
//创建二叉树
printf("\n*************%s********************\n",__FUNCTION__);
TreeNode* A = CreatTreeNode('a');
TreeNode* B = CreatTreeNode('b');
TreeNode* C = CreatTreeNode('c');
TreeNode* D = CreatTreeNode('d');
A->lchild = B;
A->rchild = C;
B->lchild = D;
PostOrder(A);
printf("\n");
return;
}


//方式四:层序遍历
//原理:层序遍历与以上几种遍历方式右所不同,先序遍历是将访问结点的左子树与右子树入队,再将本身结点
//出队并访问自身结点,以此循环,直到队列为空,访问结束。
//此遍历中将会用到队列函数,故在此处将先实现队列的出队与入队操作函数的实现


//队列的入队操作
void PushQueue(Queue* head,TreeNode* value){
if(head == NULL){
//非法输入
return;
}
if(head->size>=100){
//队满
return;
}
if(value == NULL){
return;
}
head->arr[(head->size+head->cur)%100] = (*value);
++head->size;
return;
}
//队列的出队操作
void PopQueue(Queue* head){
if(head == NULL){
//非法输入
return;
}
if(head->size == 0){
//空队
return;
}
++head->cur;
--head->size;
return;
}
//获得队列的队首元素
void QueueTop(Queue*head,TreeNode* value){
if(head == NULL){
//非法输入
return;
}
if(head->size == 0){
//空队
return;
}
(*value) = head->arr[head->cur%100];
   return;
}
//层序遍历的实现
void _levelOrder(Queue* que){
TreeNode value;
if(que == NULL){
//非法输入
return;
}
while(1){
if(que->size == 0){
//空队
return;
}
QueueTop(que,&value);
printf("%c ",value.data);
PushQueue(que,value.lchild);
PushQueue(que,value.rchild);
PopQueue(que);
}
}


void levelOrder(TreeNode* root){
if(root == NULL){
//空树
return;
}
Queue que = {
0,
{0},
0
};
PushQueue(&que,root);
_levelOrder(&que);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值