树形结构相关概念

1> 树形结构:表示数据元素之间存在一对多的关系

2> 树:是由一个根结点个多个子树构成的树形结构

3> 节点:就是树中的数据元素

4> 父亲结点:当前结点的直接上级节点

5> 孩子节点:当前结点的直接下级节点

6> 祖先结点:当前结点的直接或间接上级节点

7> 子孙节点:当前结点的直接或间接下级节点

8> 兄弟节点:拥有相同父结点的所有节点互称为兄弟节点

9> 堂兄弟节点:其父结点在同一层的所有节点,互为堂兄弟节点

10> 根结点:没有父结点的节点

11> 叶子节点:没有子节点的节点称为叶子节点

12> 分支节点:节点的度不为0的节点叫分支节点

13> 节点的度:就是当前结点的孩子节点个数,就称为节点的度

14> 树的度:就是树中节点的度的最大值

15> 节点的层次:从根结点开始到当前结点所经历的层数称为该节点的层次

16> 树的层次:输出节点的层次的最大值

二叉树

2.1 二叉树的相关概念

1> 二叉树:由根结点和最多两个子树组成,并且严格区分左右子树的树形结构

2> 左子树:由当前结点的左孩子节点为根结点构成的二叉树

3> 右子树:由当前结点的右孩子节点为根结点构成的二叉树

4> 满二叉树:二叉树的最后一层全是叶子节点,在没有添加层数的条件下,不能在向该树中增加节点的树

(除了最后一层为叶子节点外,其余层中的节点的度全为2)

5> 完全二叉树:在一棵满二叉树的基础上,最后一层自右向左逐渐减少节点的二叉树

2.2 二叉树的状态

一共有五种:空二叉树、只有根结点、只有根结点和左孩子、只有根结点和右孩子、全都有

 2.3 二叉树的性质

1> 在二叉树的第 i 层上最多有 2^(i-1)个节点

2> 在二叉树的前n层最多有 2^n - 1个节点

3> 在二叉树中,叶子节点的个数,总比度为2的节点个数多 1
 

假设:         n0:表示度为0的节点总个数

、                n1:表示度为1的节点总个数

                    n2:表示度为2的节点总个数

              总度数 = 总结点数据 -1;

              总度数 = 0*n0 + 1*n1 + 2*n2;

              总结点 = n0 + n1 + n2;

              _____________________________________

               n2 = n0 - 1;

 4> 在二叉树上,如果第i个节点存在左孩子,那么其左孩子一定是第 2*i个节点,如果存在右孩子,那么一定是第2*i+1个节点

2.4 二叉树的存储

1> 顺序存储

对于普通的二叉树而言,如果使用顺序存储,会浪费大量的存储空间,因为需要给没有节点的位置留出空间,以便于后期的插入

顺序存储,一般用于存储完全二叉树,不适合存储普通的二叉树

2> 链式存储

2.5 二叉树的创建 

#include"bitree.h"

//创建二叉树
BiTreePtr tree_create()
{
    char data = 0;
    scanf(" %c", &data);   //数据元素值
    if(data == '#')
    {
        return NULL;
    }

    //如果不是NULL,需要申请结点
    BiTreePtr p = (BiTreePtr)malloc(sizeof(Node));
    if(NULL==p)
    {
        printf("结点申请失败\n");
        return NULL;
    }

    //将数据元素放入数据域中
    p->data = data;

    //递归创建左子树
    p->left_child = tree_create();

    //递归创建右子树
    p->right_child = tree_create();

    return p;     //将创建好的二叉树返回
}

 2.6 先序遍历

//先序遍历
void prio_order(BiTreePtr B)
{
    //判断逻辑
    if(NULL == B)
    {
        return;            //递归出口
    }
    
    //输出数据域
    printf("%c\t", B->data);

    //先序遍历左子树
    prio_order(B->left_child);

    //先序遍历右子树
    prio_order(B->right_child);

}

2.7 中序遍历

//中序遍历
void in_order(BiTreePtr B)
{
    //判断逻辑
    if(NULL == B)
    {
        return;            //递归出口
    }
    

    //中序遍历左子树
    in_order(B->left_child);

    //输出数据域
    printf("%c\t", B->data);

    //中序遍历右子树
    in_order(B->right_child);

}

2.8 后序遍历

//后序遍历
void post_order(BiTreePtr B)
{
    //判断逻辑
    if(NULL == B)
    {
        return;            //递归出口
    }
    

    //后序遍历左子树
    post_order(B->left_child);


    //后序遍历右子树
    post_order(B->right_child);

    //输出数据域
    printf("%c\t", B->data);
}

2.9 所有代码

1> bitree.h
#ifndef BITREE_H
#define BITREE_H
#include<myhead.h>

typedef char datatype;    //定义数据类型
//定义结点类型
typedef struct Node
{
    datatype data;    //数据域

    struct Node * left_child;  //左孩子指针
    struct Node * right_child; //右孩子指针
}Node, *BiTreePtr;

//创建二叉树
BiTreePtr tree_create();

//先序遍历
void prio_order(BiTreePtr B);


//中序遍历
void in_order(BiTreePtr B);


//后序遍历
void post_order(BiTreePtr B);





#endif
2> bitree.c
#include"bitree.h"

//创建二叉树
BiTreePtr tree_create()
{
    char data = 0;
    scanf(" %c", &data);   //数据元素值
    if(data == '#')
    {
        return NULL;
    }

    //如果不是NULL,需要申请结点
    BiTreePtr p = (BiTreePtr)malloc(sizeof(Node));
    if(NULL==p)
    {
        printf("结点申请失败\n");
        return NULL;
    }

    //将数据元素放入数据域中
    p->data = data;

    //递归创建左子树
    p->left_child = tree_create();

    //递归创建右子树
    p->right_child = tree_create();

    return p;     //将创建好的二叉树返回
}

//先序遍历
void prio_order(BiTreePtr B)
{
    //判断逻辑
    if(NULL == B)
    {
        return;            //递归出口
    }
    
    //输出数据域
    printf("%c\t", B->data);

    //先序遍历左子树
    prio_order(B->left_child);

    //先序遍历右子树
    prio_order(B->right_child);

}


//中序遍历
void in_order(BiTreePtr B)
{
    //判断逻辑
    if(NULL == B)
    {
        return;            //递归出口
    }
    

    //中序遍历左子树
    in_order(B->left_child);

    //输出数据域
    printf("%c\t", B->data);

    //中序遍历右子树
    in_order(B->right_child);

}


//后序遍历
void post_order(BiTreePtr B)
{
    //判断逻辑
    if(NULL == B)
    {
        return;            //递归出口
    }
    

    //后序遍历左子树
    post_order(B->left_child);


    //后序遍历右子树
    post_order(B->right_child);

    //输出数据域
    printf("%c\t", B->data);
}
3> main.c
#include"bitree.h"
#include<myhead.h>

int main(int argc, const char *argv[])
{
    //调用创建函数
    BiTreePtr B = tree_create();
    if(NULL == B)
    {
        printf("创建失败\n");
        return -1;
    }

    printf("创建成功\n");

    printf("先序遍历结果为:");
    prio_order(B);
    printf("\n");


    printf("中序遍历结果为:");
    in_order(B);
    printf("\n");


    printf("后序遍历结果为:");
    post_order(B);
    printf("\n");
    return 0;
}

2.10 考核方式:

        先序后序定顺序,中序遍历分左右

1> 根据访问序列顺序,画出二叉树

        已知一棵二叉树的先序序列 A B D E C F G 和中序序列 D B E A F G C ,画出二叉树。

2> 给出其中两种序列访问方式,写出第三种序列访问方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值