1.头文件与二叉树的节点
这里使用的是孩子兄弟关系的二叉树,其中FirstChild为左孩子,NextSibling为右孩子。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct _TNode {
int data;
struct _TNode* FirstChild;
struct _TNode* NextSibling;
}TNode;
PS.访问函数
void visit(TNode* T)
{
printf("%d ", T->data);
}
2.主函数
int main(void)
{
TNode* T = NULL;
CreatTree(&T);
//递归
_PreOrderTraverse(T);
printf("\n");
_InOrderTraverse(T);
printf("\n");
_PostOrderTraverse(T);
printf("\n");
//非递归
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
return 0;
}
3.二叉树的创建
二叉树的创建要注意使用结构体指针的指针,这样才能保证使用时可以对内存中的对应位置进行修改。创建时使用到了递归。
void CreatTree(TNode** T)
{
int e;
scanf("%d", &e);
if (e == -1)
{
(*T) = NULL;
}
else
{
(*T) = (TNode*)malloc(sizeof(TNode));
(*T)->data = e;
CreatTree(&(*T)->FirstChild);
CreatTree(&(*T)->NextSibling);
}
}
4.二叉树的递归遍历
递归遍历的核心是访问数据时的顺序,其决定了遍历类型。如下代码所示:
//递归
void _PreOrderTraverse(TNode* T)
{
if (T != NULL)
{
visit(T);
_PreOrderTraverse(T->FirstChild);
_PreOrderTraverse(T->NextSibling);
}
}
void _InOrderTraverse(TNode* T)
{
if (T != NULL)
{
_InOrderTraverse(T->FirstChild);
visit(T);
_InOrderTraverse(T->NextSibling);
}
}
void _PostOrderTraverse(TNode* T)
{
if (T != NULL)
{
_PostOrderTraverse(T->FirstChild);
_PostOrderTraverse(T->NextSibling);
visit(T);
}
}
5.二叉树的非递归遍历
非递归遍历主要使用了栈作为递归的替代,较为复杂一点。
其中先序遍历与后序遍历之间存在关系(注意观察代码),后序遍历的相反顺序是将先序遍历调整入栈顺序得到的。
//非递归
void PreOrderTraverse(TNode* T)
{
if (T != NULL)
{
TNode* stack[MAXSIZE];
int top = -1;
TNode* p = NULL;
stack[++top] = T;
while (top != -1)
{
p = stack[top--];
visit(p);
if (p->NextSibling != NULL)
stack[++top] = p->NextSibling;
if (p->FirstChild != NULL)
stack[++top] = p->FirstChild;
}
}
}
void InOrderTraverse(TNode* T)
{
if (T != NULL)
{
TNode* stack[MAXSIZE];
int top = -1;
TNode* p = NULL;
p = T;
while (top != -1 || p != NULL)
{
while (p != NULL)
{
stack[++top] = p;
p = p->FirstChild;
}
if (top != -1)
{
p = stack[top--];
visit(p);
p = p->NextSibling;
}
}
}
}
void PostOrderTraverse(TNode* T)
{
if (T != NULL)
{
TNode* stack1[MAXSIZE];
TNode* stack2[MAXSIZE];
int top1 = -1;
int top2 = -1;
TNode* p1 = NULL;
stack1[++top1] = T;
while (top1 != -1)
{
p1 = stack1[top1--];
stack2[++top2] = p1;
if (p1->FirstChild != NULL)
stack1[++top1] = p1->FirstChild;
if (p1->NextSibling != NULL)
stack1[++top1] = p1->NextSibling;
}
while (top2 != -1)
{
visit(stack2[top2--]);
}
}
}