今天写的是二叉树的一些操作,这个应该会写两到三篇博客,还会牵连一些别的东西,以后都会写。
一个简单的二叉树结点包括1个数据域,一个左孩子节点和一个右孩子节点。所以定义出一个结构体。
typedef char ElemType;
typedef struct BtNode
{
BtNode *leftchild;
BtNode *rightchild;
ElemType data;
}BtNode, *BinaryTree;
之后是创建节点和销毁二叉树的函数
BtNode * Buynode()
{
BtNode *s = (BtNode*)malloc(sizeof(BtNode));
if(s == NULL) exit(1);
memset(s,0,sizeof(BtNode));
return s;
}
void Freenode(BtNode *p)
{
free(p);
}
之后二叉树的遍历方式,今天先写先序中序和后序的吧,使用递归比较容易,也可以非递归写,先写递归的吧,这个比较好理解,而且写起来简单
void PreOrder(BtNode *ptr)
{
if(ptr != NULL)
{
printf("%c ",ptr->data);
PreOrder(ptr->leftchild);
PreOrder(ptr->rightchild);
}
}
void InOrder(BtNode *ptr)
{
if(ptr != NULL)
{
InOrder(ptr->leftchild);
printf("%c ",ptr->data);
InOrder(ptr->rightchild);
}
}
void PastOrder(BtNode *ptr)
{
if(ptr != NULL)
{
PastOrder(ptr->leftchild);
PastOrder(ptr->rightchild);
printf("%c ",ptr->data);
}
}
使用递归就可以解决遍历问题但是如果不是用递归的话就需要用到栈来实现遍历。既然需要用到栈就需要一个东西来模拟一个栈
typedef BtNode * StackType;
typedef struct
{
StackType *data;
int top;
int maxsize;
}Stack;
用这个结构体来模拟栈,data是一个数组,保存数据,top为栈顶指针,maxsize是栈的初始最大值,这个栈的各种操作的实现在另一篇里会写,现在就当已经实现了好了,毕竟这篇的重点是二叉树2333。
好了,回到遍历问题,我先写出代码。。。。
void NicePerOrder(BtNode *ptr)
{
if(NULL == ptr) return ;
Stack st;
Init_Stack(&st);
push(&st,ptr);
while(!empty(&st))
{
ptr = top(&st); pop(&st);
printf("%c ",ptr->data);
if(ptr->rightchild != NULL)
push(&st,ptr->rightchild);
if(ptr->leftchild != NULL)
push(&st,ptr->leftchild);
}
}
void NiceInOrder(BtNode *ptr)
{
if(ptr == NULL) return ;
Stack st;
Init_Stack(&st);
while(ptr != NULL || !empty(&st))
{
while(ptr != NULL)
{
push(&st,ptr);
ptr = ptr->leftchild;
}
ptr = top(&st); pop(&st);
printf("%c ",ptr->data);
ptr = ptr->rightchild;
}
}
void NicePastOrder(BtNode *ptr)
{
if(ptr == NULL) return ;
Stack st;
Init_Stack(&st);
BtNode *tag = NULL;
while(ptr != NULL || !empty(&st))
{
while(ptr != NULL)
{
push(&st,ptr);
ptr = ptr->leftchild;
}
ptr = top(&st); pop(&st);
if(ptr->rightchild == NULL || ptr->rightchild == tag)
{
printf("%c ",ptr->data);
tag = ptr;
ptr = NULL;
}
else
{
push(&st,ptr);
ptr = ptr->rightchild;
}
}
}
这就复杂了很多了。现在已经11:30了,作为在宿舍的苦逼学生党,我现在已经没网了,所以这篇那流量发了。。那么这样的话这个东西的解释就只好下篇再写了,这篇就先鸽了。。。。