关于二叉树的操作(一)

今天写的是二叉树的一些操作,这个应该会写两到三篇博客,还会牵连一些别的东西,以后都会写。
一个简单的二叉树结点包括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了,作为在宿舍的苦逼学生党,我现在已经没网了,所以这篇那流量发了。。那么这样的话这个东西的解释就只好下篇再写了,这篇就先鸽了。。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值