首页 > 编程语言 >重生之我在异世界学编程之数据结构与算法:深入数和二叉树篇

重生之我在异世界学编程之数据结构与算法:深入数和二叉树篇

时间:2025-01-05 14:32:42浏览次数:3  
标签:遍历 TreeNode 二叉树 printf 重生 数据结构 root 节点

大家好,这里是小编的博客频道
小编的博客:就爱学编程

很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

目录


在这里插入图片描述


那接下来就让我们开始遨游在知识的海洋!


一、树的基本概念

定义:树是一种非线性数据结构,它由 n(n≥0)个有限节点组成一个具有层次关系的集合。它有一个特殊的节点,称为根节点,其余节点分成 m(m≥0)个互不相交的子集,每个子集又是一棵树,称为原树的子树。

基本术语:

  • 节点的度:一个节点含有的子树的个数称为该节点的度。
  • 叶子节点:度为 0 的节点称为叶节点或终端节点。
  • 非叶子节点:度不为 0 的节点称为非叶节点或非终端节点。除根节点之外,非叶子节点也称为内部节点。
  • 节点的层次:从根开始定义起,根为第一层,根的子节点为第二层,以此类推。
  • 树的高度或深度:树中节点的最大层次。
  • 父节点和子节点:若节点 A 有直达节点 B 的路径,且 A 在这条路径上距离 B 最近,则称 A 为 B 的父节点,B 是 A 的子节点。
  • 兄弟节点:有共同父节点的节点互为兄弟节点。

表示方法:可以用孩子链表表示法双亲孩子表示法孩子-兄弟表示法等来表示一棵树


二、二叉树的基本概念

定义:二叉树是树形结构的一种特殊形式,它的特点是每个节点最多有两个子节点,通常被称为左子节点和右子节点。

性质:

在二叉树的第 i 层上至多有 2^(i-1) 个节点(i≥1)。
深度为 k 的二叉树至多有 2^k - 1 个节点(k≥1)。
对任何一棵二叉树 T,如果其终端节点数为 n0,度为 2 的节点数为 n2,则 n0 = n2 + 1。

分类:

满二叉树:一棵深度为 k 且有 2^k - 1 个节点的二叉树称为满二叉树。
完全二叉树:深度为 k 的,有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 k 的满二叉树中编号从 1 至 n 的节点一一对应时称之为完全二叉树。

遍历方法:

  • 前序遍历:访问顺序是根节点→左子树→右子树。
  • 中序遍历:访问顺序是左子树→根节点→右子树。
  • 后序遍历:访问顺序是左子树→右子树→根节点。
  • 层序遍历:按树的结构从上到下、从左到右依次访问各个节点。

三、在 C 语言中实现二叉树

在 C 语言中,可以使用结构体和指针来实现二叉树。以下为例:

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

// 定义二叉树节点结构体
typedef struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

// 创建新节点
TreeNode* createNode(int val) {
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
    newNode->val = val;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 前序遍历
void preOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    printf("%d ", root->val);
    preOrderTraversal(root->left);
    preOrderTraversal(root->right);
}

// 中序遍历
void inOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    inOrderTraversal(root->left);
    printf("%d ", root->val);
    inOrderTraversal(root->right);
}

// 后序遍历
void postOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    postOrderTraversal(root->left);
    postOrderTraversal(root->right);
    printf("%d ", root->val);
}

int main() {
    // 创建二叉树
    TreeNode* root = createNode(1);
    root->left = createNode(2);
    root->right = createNode(3);
    root->left->left = createNode(4);
    root->left->right = createNode(5);

    // 遍历二叉树
    printf("Pre-order traversal: ");
    preOrderTraversal(root);
    printf("
");

    printf("In-order traversal: ");
    inOrderTraversal(root);
    printf("
");

    printf("Post-order traversal: ");
    postOrderTraversal(root);
    printf("
");

    // 注意:这里只是示例代码,没有实现释放内存的操作,实际使用中需要添加释放内存的代码以避免内存泄漏。

    return 0;
}
  • 这个例子中,我们定义了二叉树节点的结构体 TreeNode ,并实现了创建新节点和前序、中序、后序遍历的函数。然后在 main 函数中创建了一个简单的二叉树,并对它进行了遍历。

快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!

标签:遍历,TreeNode,二叉树,printf,重生,数据结构,root,节点
From: https://blog.csdn.net/z15879084549/article/details/144944488

相关文章

  • 「Java 数据结构全面解读」:从基础到进阶的实战指南
    「Java数据结构全面解读」:从基础到进阶的实战指南数据结构是程序设计中的核心部分,用于组织和管理数据。Java提供了丰富的集合框架和工具类,涵盖了常见的数据结构如数组、链表、栈、队列和树等。本文将系统性地介绍这些数据结构的概念、特点以及在Java中的实现,并通过代码......
  • C/C++调试---堆数据结构
    堆数据结构因为C/C++语言赋予程序员通过引用和指针来操纵内存对象的最大自由,所以毫不奇怪的是这些程序中的大多数bug都与错误的内存访问有关。根据错误发生的位置是栈还是堆,内存错误可分为两种:栈错误和堆错误。栈栈是分配给给一个独立的控制流(线程)的来纳许内存区域,用......
  • [数据结构学习笔记4] 链表
    链表(LinkedLists)和数组类似,链表也是用来存放一组数据。和数组不一样的是,链表存储不需要连续的内存位置,一个链表由很多节点组成,节点与节点间通过一个next指针关联。图示:NodeValue/DataNext 链表操作:查找一个值:通过链表的next指针一直往下跳直到:1.找到了想......
  • 数据结构(排序算法)
    插入排序插入排序(InsertionSort)是一种简单直观的排序算法,其原理可以简述如下:1.分已排序区间和未排序区间:将数组分为已排序区间和未排序区间。初始时,已排序区间只包含数组的第一个元素,而未排序区间包含除第一个元素之外的所有元素。2.依次将未排序区间中的元素插入到已......
  • 数据结构理论篇(期末突击)
    找往期文章包括但不限于本期文章中不懂的知识点:个人主页:我要学编程(ಥ_ಥ)-CSDN博客所属专栏: 学校课程突击下面均是为了应付学校考试所用,如果有涉及部分知识点下面未说明,可以去我的数据结构专栏看看或者自行在网上查阅资料。 以下所有知识均是阅读大话数据结构所得。如......
  • 二叉树
    描述小杨有⼀棵包含 n 个节点的二叉树,且根节点的编号为 1。这棵二叉树任意⼀个节点要么是白色,要么是黑色。之后小杨会对这棵二叉树进行 q 次操作,每次小杨会选择⼀个节点,将以这个节点为根的子树内所有节点的颜色反转,即黑色变成白色,白色变成黑色。小杨想知道 q 次操作全......
  • C语言数据结构与算法(栈和队列)
    1.栈1.栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除......
  • 03专升本数据结构笔记 第三章:栈和队列
    专升本数据结构笔记第三章:栈和队列阿洛学长笔记lovettz栈和队列任务一栈的定义、存储结构和基本操作(阿洛学长)一、栈的定义及其基本操作二、栈的顺序存储结构三、栈的链式存储结构四、栈在递归中的应用一、栈的定义及其基本操作1.栈的定义栈是一种只允许在表的......
  • 02专升本数据结构笔记 第二章:线性表
    专升本数据结构笔记第二章:线性表阿洛学长笔记lovettz线性表任务一线性表的定义和基本操作(阿洛学长)一、线性表的定义线性表是由n(n≥0)个类型相同的数据元素a1,a2,…,an组成的有限序列,数据元素之间是一对一的关系,记作L=(a1,a2,…,ai-1,ai,ai+1,…,an)(由n(n≥0)个......
  • 【java-数据结构篇】神奇 ArrayList,一键打印扑克牌花色与点数
    我的个人主页我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤收藏❤前言:在编程的奇妙世界里,数据结构如同精巧的积木,搭建起各类功能的大厦。而ArrayList,作为其中一块极为实用的“积木”,拥有着独特的魅力与强大的功能。当我们将目光投向生活中的趣味场景——扑克牌......