数据结构 --- 二叉树

一、满二叉树

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

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

每层节点数量为 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);
}
相关推荐
Logic1014 小时前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
INGNIGHT8 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_839080548 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山8 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
暮雨封夕8 小时前
跳表(Skip List)详解:原理、实现、使用场景与实际应用
数据结构
mikuyyds8 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a187927218319 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
miller-tsunami9 小时前
排序的相关知识点
数据结构·排序算法
syagain_zsx9 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_307779139 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab