遍历代码最简单的是用递归
这里的str是一个字符,如果有其他的数据结构,用一个visit()函数来输入
void PreOrder(BiTree Tree)
{
if (Tree != NULL)
{
putchar(Tree->str);
PreOrder(Tree->Lchild);
PreOrder(Tree->Rchild);
}
}
void MidOrder(BiTree Tree)
{
if (Tree != NULL)
{
MidOrder(Tree->Lchild);
putchar(Tree->str);
MidOrder(Tree->Rchild);
}
}
void LaterOrder(BiTree Tree)
{
if (Tree != NULL)
{
LaterOrder(Tree->Lchild);
LaterOrder(Tree->Rchild);
putchar(Tree->str);
}
}
层序遍历
void LayerOrder(BiList L)
{
while (L)
{
putchar(L->node->str);
L = L->next;
}
}
下面简单说一下二叉树的构建。
1、定义数据结构
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode {
char str;
struct BiTNode* Lchild;
struct BiTNode* Rchild;
}BiNode, *BiTree;
typedef struct BiQueue {
BiNode* node;
struct BiQueue* next;
}BiQue,*BiList;
typedef定义的第一个是二叉树的基本定义,大家都知道;
第二个typedef是定义了一个队列,此处按照层序来插入新的结点,队列的特点是先进先出,比如新加结点abc,a出队,a作为根节点,b出队,判定a的左孩子是否为空,为空,b成为了a的左孩子;同理c出队,判定a的左孩子是否为空(否),再判断a的右孩子是否为空(是),c成为a的右孩子,就是把a的右孩子指针指向c。
这里构建好一个队列后,构建好二叉树层序遍历只用遍历队列就可以了,不用繁琐的代码。
2、二叉树的建立
int main(){
BiTree Tree = NULL; //二叉树
BiTree T=NULL; //二叉树的结点
BiList newNode = NULL; //指向二叉树的结点,转而进入队列中
BiList front = NULL; //队列头
BiList rear = NULL; //队列尾
BiList s = NULL; //队列的滑移指针,用于指定新的二叉树的结点的接入
char str;
while (scanf("%c", &str) != EOF)
{
if (str == '\n')
break;
T = (BiTree)calloc(1, sizeof(BiNode));
T->str = str;
newNode = (BiList)calloc(1, sizeof(BiQue));
newNode->node = T;
if (Tree == NULL)
{
Tree = T;
front = newNode;
rear = newNode;
s = front;
continue;
}
rear->next = newNode;
rear = rear->next;
if (s->node->Lchild == NULL)
s->node->Lchild = T;
else if (s->node->Rchild == NULL)
{
s->node->Rchild = T;
s = s->next;
}
}
构建好二叉树,就可以进行遍历了。
PreOrder(Tree);
printf("\n");
MidOrder(Tree);
printf("\n");
LaterOrder(Tree);
printf("\n");
LayerOrder(front);
return 0;
front代表的是队列头部,传入队头,进行层序遍历。
今天就简单分享到这里~bye