数据结构C语言学习D10


前言

树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件 :
有且仅有一个特定的称为根(Root)的节点;
其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树,并称为其根的子树
表示方法 :树形表示法、目录表示法。
树还原


一、二叉树是什么?

简单地理解,满足以下两个条件的树就是二叉树:

  1. 本身是有序树;
  2. 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2
    二叉树具有以下几个性质:
  3. 二叉树中,第 i 层最多有 2i-1 个结点。
  4. 如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。
  5. 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。

二、C语言实现

1.创建树模版

代码如下(示例):

typedef char TDataType;

// create binary tree node template
typedef struct BiTNode{
  TDataType data;  // data region, son`s apearance
  struct BiTNode *lchild, *rchild; // tow sons
}BiTNode, *BiTree;

2.村的三种遍历方法(先序,中序,后序)

代码如下(示例):

// create binary tree
BiTree CreateTree(){
    TDataType data;
    BiTree r;

    scanf("%c", &data);
    if(data == '#'){
        return  NULL;
    }
    if((r = (BiTree)malloc(sizeof(BiTNode))) == NULL){
        printf("malloc space failed!!\n");
        return NULL;
    }
    // node create OK!!
    r->data = data;
    r->lchild = CreateTree();  // recursive create  == r->lchild = r->data;!!!
    r->rchild = CreateTree();  // too  lastrow

    return r;

}

// three kinds of traversal
void Preorder(BiTree r){
    if(!r) return;
    printf("%c ", r->data);
    Preorder(r->lchild);
    Preorder(r->rchild);
}

void Inorder(BiTree r){
    if(!r) return;
    Inorder(r->lchild);
    printf("%c ", r->data);
    Inorder(r->rchild);
}

void Postorder(BiTree r){
    if(!r) return;
    Postorder(r->lchild);
    Postorder(r->rchild);
    printf("%c ", r->data);
}

总结

满二叉树除了满足普通二叉树的性质,还具有以下性质:

  1. 满二叉树中第 i 层的节点数为 2n-1 个。
  2. 深度为 k 的满二叉树必有 2k-1 个节点 ,叶子数为 2k-1。
  3. 满二叉树中不存在度为 1 的节点,每一个分支点中都两棵深度相同的子树,且叶子节点都在最底层。
  4. 具有 n 个节点的满二叉树的深度为 log2(n+1)。

***对于任意一个完全二叉树来说,***如果将含有的结点按照层次从左到右依次标号,对于任意一个结点 i ,完全二叉树还有以下几个结论成立:

  1. 当 i>1 时,父亲结点为结点 [i/2] 。(i=1 时,表示的是根结点,无父亲结点)
  2. 如果 2i>n(总结点的个数) ,则结点 i 肯定没有左孩子(为叶子结点);否则其左孩子是结点 2i 。
  3. 如果 2i+1>n ,则结点 i 肯定没有右孩子;否则右孩子是结点 2i+1 。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值