数据结构 --- 二叉树

一、满二叉树

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

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

每层节点数量为 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);
}
相关推荐
黄昏ivi38 分钟前
电力系统最小惯性常数解析
算法
独家回忆3641 小时前
每日算法-250425
算法
烁3471 小时前
每日一题(小白)模拟娱乐篇33
java·开发语言·算法
Demons_kirit1 小时前
LeetCode 2799、2840题解
算法·leetcode·职场和发展
软行2 小时前
LeetCode 每日一题 2845. 统计趣味子数组的数目
数据结构·c++·算法·leetcode
永远在Debug的小殿下2 小时前
查找函数【C++】
数据结构·算法
我想进大厂2 小时前
图论---染色法(判断是否为二分图)
数据结构·c++·算法·深度优先·图论
油泼辣子多加2 小时前
【风控】稳定性指标PSI
人工智能·算法·金融
Yhame.3 小时前
【使用层次序列构建二叉树(数据结构C)】
c语言·开发语言·数据结构
雾月553 小时前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展