首页 > 其他分享 >数据结构-二叉树

数据结构-二叉树

时间:2025-01-21 21:28:20浏览次数:3  
标签:BTN val bt init 二叉树 数据结构 节点

 

树的相关概念:

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);
}

标签:BTN,val,bt,init,二叉树,数据结构,节点
From: https://blog.csdn.net/m0_68557555/article/details/145290672

相关文章

  • 《StringBuilder类的数据结构和扩容方式解读》
    StringBuilder类的简单用法、数据结构和扩容方式解读文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言在之前的文章中和大家讲过String字符串类具有不可变性,今天给大家介绍一个可变字符串类——StringBuilder类。提示:以下是本篇文章正文内......
  • 数据结构2——线性表的链式存储
    前言顺序存储结构的缺点:①插入、删除操作需要移动大量的元素。② 预先分配空间需按最大空间分配,利用不充分。③表容量扩充十分不方便(可能会产生效率问题)。而链式存储结构恰好弥补了顺序存储这些缺陷。1.认识线性表链式存储1.1线性表链式存储的构成①可用一组任意......
  • 【轻松掌握数据结构与算法】动态规划
    引言在本章中,我们将尝试解决那些使用其他技术(例如分治法和贪心法)未能得到最优解的问题。动态规划(DP)是一种简单的技术,但掌握起来可能比较困难。识别和解决DP问题的一个简单方法就是尽可能多地解决各种问题。“编程”一词与编码无关,而是源自文献,意思是填充表格,类似于线性规划。......
  • 单调队列:实用而好写的数据结构
    前言|Preface这几天连续做了好几道单调队列的题,难度从绿到蓝不等,摸索出了一些经验,也总结了一些单调队列的特点和规律。概述|Outline顾名思义,单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增(或递减)。「队列」指的是元素只能从队头和队尾进......
  • 数据结构与算法之递归: LeetCode 39. 组合总和 (Ts版)
    组合总和https://leetcode.cn/problems/combination-sum/description/描述给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合candid......
  • 【刷题实录之二叉树】leecode429. N 叉树的层序遍历(层序遍历)
    题目:给定一个N叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由null值分隔。题解:本体是层序遍历的变形,只需要将“左右孩子入队”变成“所有孩子入队”即可,需对结点数据结构有深入把握。代码(C++):classSolution{public:......
  • 01 序论(数据结构实战)
    计算机的发展与用途:早期的计算机:最初,计算机主要是用来进行数学运算,像是加减乘除这种“数值计算”。它们主要用在科学研究、工程计算等需要大量数字计算的领域。现在的计算机:现代的计算机用途广泛,已经不仅仅局限于处理数字。它们还处理许多其他类型的数据,比如文字、表格、图片......
  • 数据结构-堆及堆排序
    1.堆的定义堆(Heap)是一种数据结构,通常是一个完全二叉树。在堆中,每个节点都有一个与其相关的值,并且满足堆的性质。堆分为两种类型:大堆和小堆。大堆:在大堆中,对于每个非叶子节点,其值都大于或等于它的子节点的值。也就是说,根节点的值是整个堆中的最大值。小堆:与大堆相反,在小堆中,对......
  • 【第一天】零基础入门刷题Python-算法篇-数据结构与算法的介绍(持续更新)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Python数据结构与算法的详细介绍1.基本概念2.Python中的数据结构1.列表(List)2.元组(Tuple)3.字典(Dictionary)4.集合(Set)5.字符串(String)3.Python中的常用算法1.排序算法2.搜索算法3.递......
  • 数据结构——栈
    1、栈的概念(1)是一种特殊的线性表,只能在一端进行插入或删除操作(2)逻辑结构:线性结构;存储结构:既可以是顺序存储,也可以是链式存储(3)栈顶:允许插入或删除的一端(4)栈底:不允许插入或删除的一端,位置固定不变(5)空栈:栈中没有元素(6)使用特点:LIFO(后进先出)2、操作#define_CRT_SECURE_NO_......