Linux学习-数据结构(二叉树)

1.概念

  • 线性结构:描述数据一对一(表)的关系
  • 非线性结构:描述数据一对多(树),多对多(图)的关系

2.树形结构

  • 节点:树形结构中组成树形结构的一个小的单元称为节点
  • 前驱(祖先):由哪个节点可以访问到该节点
  • 后继(子孙):该节点可以后续访问到哪些节点
  • 层:根节点层数为1,后续每引申出来一个节点,层数+1
  • 树的层数:由层数最高的节点对应的层数表示树的层数
  • 高度:节点高度是由该节点到最远的叶子节点的距离表示该节点高度
  • 深度:节点深度由该节点到根节点的距离表示节点深度
  • 树的高度 == 树的深度 == 树的层数
  • 度:后继节点的个数

节点:

  • 根节点:只有后继没有前驱
  • 分支节点:既有前驱也有后继
  • 叶子节点:只有前驱没有后继

3.二叉树

1.概念

树型结构中的所有节点度数最大为2,称为二叉树

2.二叉树节点状态

  • 叶子节点:度数为0
  • 只有左孩子
  • 只有右孩子
  • 左右孩子都有

3.满二叉树

所以的叶子节点均在同一层,且每层节点个数均为最大值


特性:

  • 满二叉树第k层节点有2^{k-1}
  • 满二叉树前k层节点有2^{k}-1

4.完全二叉树

二叉树的编号(如果节点编号为n,左孩子编号为2n,右孩子编号为2n+1)展开是连续的,称为完全二叉树


二叉树的遍历形式

  • 深度优先遍历(DFS)
  • 广度优先遍历(BFS)

深度优先遍历(DFS)

  • 前序遍历:根左右

  • 中序遍历:左根右

  • 后序遍历:左右根

广度优先遍历(层序遍历)

4.完全二叉树的操作

1.定义

typedef struct node{
    int no;
    struct node *pleftchild;
    struct node *prightchild;
}treenode;

2.使用形式(递归)

treenode *creat_treechild(int startno, int endno)
{
    treenode *ptmpnode = NULL;

    ptmpnode = malloc(sizeof(treenode));
    if(ptmpnode == NULL)
    {
        perror("fail to malloc");
        return NULL;
    } 

    ptmpnode->no = startno;
    ptmpnode->pleftchild = ptmpnode->prightchild = NULL;
    if(2*startno <= endno)
    {
        ptmpnode->pleftchild = creat_treechild(2*startno, endno);
    }
    
    if(2*startno+1 <= endno)
    {
        ptmpnode->prightchild = creat_treechild(2*startno+1, endno);
    }    

    return ptmpnode;
}

/*前序遍历*/
int preorder_treechild(treenode *proot)
{
    printf("%d ",proot->no);
    if(proot->pleftchild != NULL)
    {
        preorder_treechild(proot->pleftchild);
    }
    if(proot->prightchild != NULL)
    {
        preorder_treechild(proot->prightchild);
    }

    return 0;
}

/*中序遍历*/
int midorder_treechild(treenode *proot)
{
    if(proot->pleftchild != NULL)
    {
        preorder_treechild(proot->pleftchild);
    }
    printf("%d ",proot->no);
    if(proot->prightchild != NULL)
    {
        preorder_treechild(proot->prightchild);
    }

    return 0;
}

/*后续遍历*/
int posorder_treechild(treenode *proot)
{
    if(proot->pleftchild != NULL)
    {
        preorder_treechild(proot->pleftchild);
    }
    if(proot->prightchild != NULL)
    {
        preorder_treechild(proot->prightchild);
    }
    printf("%d ",proot->no);

    return 0;
}

int destroy_treechild(treenode *proot)
{
    if(proot->pleftchild)
    {
        destroy_treechild(proot->pleftchild);
    }
    if(proot->prightchild)
    {
        destroy_treechild(proot->prightchild);
    }

    free(proot);
    proot = NULL;

    return 0;
}

层序遍历

int layoutorder_treechild(treenode *proot)
{
    linkqueue *ptmpqueue = NULL;
    treenode *ptmpnode = NULL;

    ptmpqueue = creat_empty_linkqueue();
    enter_data_linkqueue(ptmpqueue, proot);
    while(!is_empty_linkqueue(ptmpqueue))
    {
        ptmpnode = out_data_linkqueue(ptmpqueue);
        printf("%d ", ptmpnode->no);
        if(ptmpnode->pleftchild != NULL)
        {
            enter_data_linkqueue(ptmpqueue,ptmpnode->pleftchild);
        }
        if(ptmpnode->prightchild != NULL)
        {
            enter_data_linkqueue(ptmpqueue, ptmpnode->prightchild);
        }
    }

    destroy_linkqueue(&ptmpqueue);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值