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

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

小编的博客:就爱学编程
很高兴在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 函数中创建了一个简单的二叉树,并对它进行了遍历。

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

相关推荐
Alex艾力的IT数字空间14 小时前
完整事务性能瓶颈分析案例:支付系统事务雪崩优化
开发语言·数据结构·数据库·分布式·算法·中间件·php
虫师c14 小时前
List vs Set:深入剖析Java两大集合的核心区别与实战应用
java·数据结构·list·set·java集合
橘颂TA14 小时前
【剑斩OFFER】算法的暴力美学——寻找峰值
数据结构·算法·力扣·c/c++
陈陈爱java14 小时前
秋招八股算法常见
数据结构·算法
不穿格子的程序员14 小时前
从零开始写算法——二分-寻找旋转排序数组中的最小值
数据结构·算法·leetcode·二分查找
贩卖黄昏的熊18 小时前
数据结构示例代码
数据结构
_fairyland18 小时前
数据结构 力扣 练习
数据结构·考研·算法·leetcode
点云SLAM20 小时前
算法与数据结构之二叉树(Binary Tree)
数据结构·算法·二叉树·深度优先·广度优先·宽度优先
小龙报20 小时前
《算法通关指南:算法基础篇 --- 一维前缀和 — 1. 【模板】一维前缀和,2.最大子段和》
c语言·数据结构·c++·算法·职场和发展·创业创新·visual studio
.柒宇.1 天前
力扣hoT100之找到字符串中所有字母异位词(java版)
java·数据结构·算法·leetcode