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

大家好,这里是小编的博客频道

小编的博客:就爱学编程
很高兴在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 语言中,可以使用结构体和指针来实现二叉树。以下为例:

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 函数中创建了一个简单的二叉树,并对它进行了遍历。

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

相关推荐
don't_be_bald3 小时前
数据结构与算法-顺序表
c语言·开发语言·数据结构·学习·链表
帅到爆的努力小陈4 小时前
进制转换(蓝桥杯)
java·数据结构·算法
Y_3_77 小时前
146. LRU 缓存 : 实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构
数据结构·缓存
Cedric_Anik9 小时前
数据结构——二叉树
数据结构·算法
KeyPan9 小时前
【数据结构与算法:八、排序】
开发语言·数据结构·人工智能·后端·算法·排序算法·scala
running thunderbolt9 小时前
数据结构:二叉搜索树详解
数据结构
XWXnb69 小时前
数据结构:树
数据结构·算法
冠位观测者9 小时前
【Leetcode 热题 100】74. 搜索二维矩阵
数据结构·算法·leetcode
終不似少年遊*12 小时前
数据结构与算法之排序
数据结构·python·算法·排序算法
James Shangguan12 小时前
LeetCode 704 如何正确书写一个二分查找
数据结构·算法·leetcode