数据结构 --- 二叉树

一、满二叉树

在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上,这

样的二叉树称为满二叉树。

每层节点数量为 2 ^ (n - 1) (n为层数)

总节点个数为 2 ^ n - 1

二、完全二叉树

在满二叉树的基础上,从上往下,从左往右增加节点;从下往上,从右往左减少节点

满二叉树 ==== 完全二叉树

完全二叉树 ====? 满二叉树

三、二叉树的遍历

创建一个二叉树 (扩展二叉树)

|-------------|-------|-------------|
| pl(坐指针) | A | pr(右指针) |

复制代码
#ifndef __TREE_H__
#define __TREE_H__

typedef char TDatatype;

typedef struct tnode
{
    TDatatype data;
    struct tnode *pl;
    struct tnode *pr;
}tnode_t;


tnode_t *create_bin_tree();
void pre_order(tnode_t *proot);
void mid_order(tnode_t *proot);
void behind_order(tnode_t *proot);
int get_tree_node(tnode_t *proot);
int get_tree_layer(tnode_t *proot);
void destroy_tree(tnode_t *proot);
void push_tree(tnode_t *proot);


#endif

char tree[] = {"ABEH###G##CF#D##I##"};
int idx;

tnode_t *create_bin_tree()
{
    TDatatype data = tree[idx++];
    if(data == '#')
    {
        return NULL;
    }

    tnode_t *pnode = (tnode_t *)malloc(sizeof(tnode_t));
    if(!pnode)
        return NULL;
    pnode->data = data;
    pnode->pl = create_bin_tree();
    pnode->pr = create_bin_tree();

    return pnode;
}

**前序遍历:**根 左子树 右子树 ABEHGCFDI

中序遍历: 左子树 根 右子树 HEBGAFDCI

后序遍历: 左子树 右子树 根 HEGBDFICA

**层序遍历:**从上至下,从左至右,逐层遍历 ABCEGFIHD

已知 前序加中序 ------>还原二叉树

后序加中序 ------>还原二叉树

四、代码实现

1、前序遍历

复制代码
void pre_order(tnode_t *proot)
{
    if(NULL == proot)
        return;
    printf("%c ",proot->data);
    pre_order(proot->pl);
    pre_order(proot->pr);
}

2、中序遍历

复制代码
void mid_order(tnode_t *proot)
{
    if(!proot)
        return ;
    mid_order(proot->pl);
    printf("%c ",proot->data);
    mid_order(proot->pr);
}

3、后序遍历

复制代码
void behind_order(tnode_t *proot)
{
    if(!proot)
        return ;
    behind_order(proot->pl);
    behind_order(proot->pr);
    printf("%c ",proot->data);
}

4、层序遍历

层序遍历中需要用到 队列知识

复制代码
void push_tree(tnode_t *proot)
{
    queue_t *que = create_queue();
    push_queue(que,proot);
    
    while(!is_empty_queue(que))  //判断队列是否为空,空返回1,非空为0
    {
        tnode_t *p;
        pop_queue(que,&p);
        printf("%c ",p->data);
        if(p->pl)
        {
            push_queue(que,p->pl);
        } 
        if(p->pr)
        {
            push_queue(que,p->pr);
        }

    }
    printf("\n");
    destroy_queue(que);
}

5、获取二叉树的节点个数

复制代码
int get_tree_node(tnode_t *proot)
{
    if(!proot)
        return 0;
    return get_tree_node(proot->pl) + get_tree_node(proot->pr) + 1;
}

6、获取二叉树的层数

复制代码
int get_tree_layer(tnode_t *proot)
{
    if(!proot)
        return 0;
    int cntl = get_tree_layer(proot->pl);
    int cntr = get_tree_layer(proot->pr);

    return cntl > cntr ? cntl + 1 : cntr + 1;
} 

7、销毁二叉树

复制代码
void destroy_tree(tnode_t *proot)
{
    if(!proot)
        return;
    destroy_tree(proot->pl);
    destroy_tree(proot->pr);
    free(proot);
}
相关推荐
那雨倾城6 分钟前
用 YOLO Pose + Segmentation 在PiscCode构建“语义佛光”:一次实时视觉语义融合实验
图像处理·python·opencv·算法·yolo·计算机视觉·视觉检测
nnerddboy7 分钟前
解决传统特征波段选择的局限性:1.对偶学习
学习·算法·机器学习
业精于勤的牙8 分钟前
最长特殊序列(一)
java·javascript·数据结构
CoovallyAIHub15 分钟前
自顶向下 or 自底向上?姿态估计技术是如何进化的?
深度学习·算法·计算机视觉
q_302381955625 分钟前
14.7MB轻量模型!NVIDIA Jetson边缘设备解锁工厂设备故障预警新方案
人工智能·python·算法·ascend·算子开发
爱敲点代码的小哥33 分钟前
C#哈希表遍历技巧全解析以及栈 堆 队列的认识
算法·哈希算法
xiaoxue..35 分钟前
爬楼梯问题:从递归到动态规划再到闭包的进化之路
javascript·算法·面试·动态规划
音浪豆豆_Rachel36 分钟前
Flutter跨平台通信的实战演练:复杂数据结构与单元测试在鸿蒙生态中的完美实现
数据结构·flutter·单元测试·harmonyos
旺仔小拳头..36 分钟前
数据结构(二)线性表————栈与队列
数据结构
CoovallyAIHub38 分钟前
YOLO11算法深度解析:四大工业场景实战,开源数据集助力AI质检落地
深度学习·算法·计算机视觉