数据结构-二叉树

server/2025/1/24 12:48:37/

 

树的相关概念:

1、节点的度:树中一个节点的孩子个数称为该节点的度, 所有节点的度的最大值是树的度

2、分支节点:度大于0的节点称为分支节点

3、叶子结点:度为0的节点称为叶子结点

4、节点的层次(深度):从上往下数,根节点为1层,依次往下加1

5、树的高度(深度):树中节点的最大层次

6、树中节点的各子树从左至又是有次序的,不能互换,则该树称为有序树,否则称为无序树

7、双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点

8、孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

9、兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

10、森林:森林是m(m >= 0 )棵互不相交的树的集合,

11、树去掉根节点就成为森林,森林加上根节点就是树

1.逻辑结构:树形结构(元素之间存在一对二关系)

2.存储结构:既可以顺序存储,也可以链式存储
注意:如果是顺序存储,必须是完全二叉树,如果是普通二叉树,需要转换成完全二叉树,在进行存储,
会造成内存浪费,推荐使用链式存储

3.二叉树链式存储适用于所有的二叉树

二叉树的性质:
1、二叉树的度数为2
2、二叉树严格区分左子树和右子树
3、二叉树的第k层上最多有2^(k-1)个节点
4、深度为k的二叉树,最多有2^k  + 1个节点
5、任意一棵二叉树,叶子结点的个数比度数为2的节点个数多1  

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>


//定义二叉树的结构体
typedef char BT;
typedef struct BTreeBode {
    BT val;//存放二叉树节点元素值
    struct BTreeBode* left;//指向左子节点
    struct BTreeBode* right;//指向右子节点
}BTN;

//创建二叉树的三个函数
void init_tree(BTN** bt);
void init_tree1(BTN** bt);
void init_tree2(BTN** bt);

void PreOrder(BTN* bt);
void MidOrder(BTN* bt);
void EndOrder(BTN* bt);

int main() {
    BTN* bt = NULL;//二叉树的根节点指针


    //二叉树的初始化
    printf("请先序创建一个二叉树\n");
    init_tree(&bt);

    printf("请中序创建一个二叉树\n");
    init_tree1(&bt);

    printf("请后序创建一个二叉树\n");
    init_tree2(&bt);

    //先序遍历
    PreOrder(bt);
    printf("\n");

    //中序遍历
    MidOrder(bt);
    printf("\n");

    //后序遍历
    EndOrder(bt);
    return 0;
}


//先序创建:根左右   初始化函数,就是把树的所有节点存进去的过程   
void init_tree(BTN** bt) {
    BT val = 0;
    scanf("%c", &val);   //%c,一次只接收一个字符
    if (val == '#') {
        //空树
        *bt = NULL;
    }
    else {
        //创建新节点
        *bt = (BTN*)malloc(sizeof(BTN));
        (*bt)->val = val;
        init_tree(&(*bt)->left);//创建左子树
        init_tree(&(*bt)->right);//创建右子树
    }
}

//中序创建:左根右   初始化函数,就是把树的所以节点存进去的过程   
void init_tree1(BTN** bt) {
    BT val = 0;
    scanf("%c", &val);   //%c,一次只接收一个字符
    if (val == '#') {
        //空树
        *bt = NULL;
    }
    else {
        //创建新节点
        *bt = (BTN*)malloc(sizeof(BTN));
        init_tree1(&(*bt)->left);//创建左子树
        (*bt)->val = val;
        init_tree1(&(*bt)->right);//创建右子树
    }
}

//后序创建:左右根   初始化函数,就是把树的所以节点存进去的过程   
void init_tree2(BTN** bt) {
    BT val = 0;
    scanf(" %c", &val);   //%c,一次只接收一个字符
    if (val == '#') {
        //空树
        *bt = NULL;
    }
    else {
        //创建新节点
        *bt = (BTN*)malloc(sizeof(BTN));
        init_tree2(&(*bt)->left);//创建左子树
        init_tree2(&(*bt)->right);//创建右子树
        (*bt)->val = val;
    }
}


//先序遍历函数          根  左  右      A B C D E
void PreOrder(BTN* bt) {
    if (bt == NULL) {
        return;
    }
    printf("%c ", bt->val);
    PreOrder(bt->left);//左子树
    PreOrder(bt->right);//右子树
}

//中序遍历函数          左  根  右     C B D A E
void MidOrder(BTN* bt) {
    if (bt == NULL) {//递归调用
        return;
    }
    MidOrder(bt->left);//左子树
    printf("%c ", bt->val);
    MidOrder(bt->right);//右子树
}

//后序遍历函数          左  右  根        C D B E A
void EndOrder(BTN* bt) {
    if (bt == NULL) {//递归调用
        return;
    }
    EndOrder(bt->left);//左子树
    EndOrder(bt->right);//右子树
    printf("%c ", bt->val);
}


http://www.ppmy.cn/server/161019.html

相关文章

Javaweb之css

css的三种引入方式 1内行式 2.内嵌式 3.外部样式表 内行式和内嵌式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

OpenCV相机标定与3D重建(66)对立体匹配生成的视差图(disparity map)进行验证的函数validateDisparity()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用左右检查来验证视差。矩阵 “cost” 应该由立体对应算法计算。 cv::validateDisparity 函数是 OpenCV 库中用于对立体匹配生成的视差图&…

2025发文新方向:AI+量化 人工智能与金融完美融合!

2025深度学习发论文&模型涨点之——AI量化 人工智能的融入&#xff0c;使量化交易实现了质的突破。借助机器学习、深度学习等先进技术&#xff0c;人工智能可高效处理并剖析海量市场数据&#xff0c;挖掘出数据背后错综复杂的模式与趋势&#xff0c;从而不仅提升了数据分析…

汇编实验·循环程序设计

一、实验目的: 1.掌握汇编语言循环程序编写的基本方法。 2.理解高级语言中的循环的实现方式。 3.理解循环程序对性能的一些影响因素。 二、实验内容 1.C语言函数void*memset(void*s,intch,size_tn);是将s中当前位置后面的n个字节用ch替换,通常用于在一段内存块中填充某个…

nuxt3项目打包部署到服务器后配置端口号和开启https

nuxt3打包后的项目部署相对于一般vite打包的静态文件部署要稍微麻烦一些&#xff0c;还有一个主要的问题是开发环境配置的.env环境变量在打包后部署时获取不到&#xff0c;具体的解决方案可以参考我之前文章 nuxt3项目打包后获取.env设置的环境变量无效的解决办法。 这里使用的…

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

99.10 金融难点通俗解释:投资资本回报率(ROIC)

目录 0. 承前1. 简述2. 比喻&#xff1a;养鸡赚钱2.1 第一步&#xff1a;分清投入2.2 第二步&#xff1a;开始经营2.3 第三步&#xff1a;计算收益2.4 第四步&#xff1a;计算ROIC 3. 生活中的例子3.1 高效率经营3.2 普通经营3.3 低效率经营 4. 小朋友要注意4.1 ROIC看什么4.2 …

Java数据结构 (从0构建链表(LinkedList))

在本文中&#xff0c;我们将基于 MySingleLinkedList 类&#xff0c;深入探讨单链表的实现&#xff0c;包括创建、插入、删除等核心操作&#xff0c;同时分享完整的代码示例。单链表是一种灵活的数据结构&#xff0c;适用于处理需要频繁插入和删除操作的场景&#xff0c;例如实…