C语言近万字为你讲透树与二叉树

C语言近万字为你讲透树与二叉树

什么是树?

树是一种用来组织数据的非线性数据结构,它由一个根节点和若干个子节点组成,并且每个节点可能有若干个子节点。

什么是二叉树?

二叉树是一种特殊的树,它的每个节点最多只有两个子节点,并且分别称为左子节点和右子节点,左子节点在二叉树中永远排在右子节点的前面。

二叉树的遍历方式

二叉树的遍历方式有三种:

  • 前序遍历(preorder traversal):对于每个节点,先访问该节点,然后依次遍历左子树和右子树。
  • 中序遍历(inorder traversal):对于每个节点,先遍历左子树,然后访问该节点,最后遍历右子树。
  • 后序遍历(postorder traversal):对于每个节点,先遍历左子树和右子树,最后访问该节点。

二叉树的实现方式

二叉树的实现可以通过链表或数组来实现,链表实现方式可以采用链式存储结构,数组实现方式可以采用顺序存储结构。

通过链表来实现二叉树

二叉树的节点结构可以定义为:

typedef struct TreeNode {
    int data;
    struct TreeNode *leftChild;
    struct TreeNode *rightChild;
} TreeNode;
  • data:节点的数据,任意数据类型。
  • leftChild:指向该节点的左子树。
  • rightChild:指向该节点的右子树。

通过数组来实现二叉树

数组实现方式可以采用一维数组来存储二叉树,通过计算数组下标来访问相应节点。假设二叉树中的节点按照层级顺序从上至下、从左至右依次编号,那么对于编号为i的节点,

  • 如果i=1,则该节点为树根节点。
  • 如果i>1,则该节点的父节点的编号为i/2(向下取整)。
  • 如果2i≤n,则该节点的左子节点的编号为2i。
  • 如果2i+1≤n,则该节点的右子节点的编号为2i+1。

示例说明

示例1

假设现有以下二叉树:

        5
       / \
      3   7
     / \   \
    1   4   9

该二叉树可以通过链表的方式实现,代码如下:

typedef struct TreeNode {
    int data;
    struct TreeNode *leftChild;
    struct TreeNode *rightChild;
} TreeNode;

void createBinaryTree(TreeNode **root) {
    int data;
    scanf("%d", &data);
    if (data == -1) {
        *root = NULL;
    } else {
        *root = (TreeNode *) malloc(sizeof(TreeNode));
        (*root)->data = data;
        createBinaryTree(&(*root)->leftChild);
        createBinaryTree(&(*root)->rightChild);
    }
}

void preOrderTraversal(TreeNode *root) {
    if (root != NULL) {
        printf("%d ", root->data);
        preOrderTraversal(root->leftChild);
        preOrderTraversal(root->rightChild);
    }
}

void inOrderTraversal(TreeNode *root) {
    if (root != NULL) {
        inOrderTraversal(root->leftChild);
        printf("%d ", root->data);
        inOrderTraversal(root->rightChild);
    }
}

void postOrderTraversal(TreeNode *root) {
    if (root != NULL) {
        postOrderTraversal(root->leftChild);
        postOrderTraversal(root->rightChild);
        printf("%d ", root->data);
    }
}

int main() {
    TreeNode *root = NULL;
    createBinaryTree(&root);
    printf("前序遍历:");
    preOrderTraversal(root);
    printf("\n中序遍历:");
    inOrderTraversal(root);
    printf("\n后序遍历:");
    postOrderTraversal(root);
    printf("\n");
    return 0;
}

在执行该程序时,输入数据为:

5
3
1
-1
-1
4
-1
-1
7
-1
9
-1
-1

程序的输出结果为:

前序遍历:5 3 1 4 7 9
中序遍历:1 3 4 5 7 9
后序遍历:1 4 3 9 7 5

示例2

假设现有以下二叉树:

        5
       / \
      3   7
     / \   \
    1   4   9

该二叉树可以通过数组的方式实现,代码如下:

#define MAX_SIZE 100

int binaryTree[MAX_SIZE] = {5, 3, 7, 1, 4, -1, 9};

void preOrderTraversal(int nodeIndex) {
    if (binaryTree[nodeIndex] != -1) {
        printf("%d ", binaryTree[nodeIndex]);
        preOrderTraversal(2 * nodeIndex);
        preOrderTraversal(2 * nodeIndex + 1);
    }
}

void inOrderTraversal(int nodeIndex) {
    if (binaryTree[nodeIndex] != -1) {
        inOrderTraversal(2 * nodeIndex);
        printf("%d ", binaryTree[nodeIndex]);
        inOrderTraversal(2 * nodeIndex + 1);
    }
}

void postOrderTraversal(int nodeIndex) {
    if (binaryTree[nodeIndex] != -1) {
        postOrderTraversal(2 * nodeIndex);
        postOrderTraversal(2 * nodeIndex + 1);
        printf("%d ", binaryTree[nodeIndex]);
    }
}

int main() {
    printf("前序遍历:");
    preOrderTraversal(1);
    printf("\n中序遍历:");
    inOrderTraversal(1);
    printf("\n后序遍历:");
    postOrderTraversal(1);
    printf("\n");
    return 0;
}

程序的输出结果为:

前序遍历:5 3 1 4 7 9
中序遍历:1 3 4 5 7 9
后序遍历:1 4 3 9 7 5

在程序中,数组binaryTree中按照层级顺序存储了二叉树的所有节点,其中-1表示空节点。可以通过计算数组下标来遍历二叉树。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言近万字为你讲透树与二叉树 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Python 实现数据结构-堆栈和队列的操作方法

    Python 实现数据结构-堆栈和队列的操作方法 在Python中,我们可以使用列表(List)数据类型来实现堆栈和队列的操作。 堆栈(Stack)的操作方法 堆栈数据结构可以理解为一种后进先出的数据存储方式,也就是说最后放入堆栈的元素最先被取出。下面介绍一下堆栈的操作方法。 创建一个堆栈 我们可以通过创建一个空的列表来实现一个堆栈。代码如下: stack …

    数据结构 2023年5月17日
    00
  • 「学习笔记」数位 DP

    「学习笔记」数位 DP 意义不大的题不写了。 点击查看目录 目录 「学习笔记」数位 DP 概述 例题 P2657 [SCOI2009] windy 数 思路 代码 P4317 花神的数论题 思路 P4124 [CQOI2016]手机号码 思路 代码 haha数 题意 思路 代码 0和1的熟练 题意 思路 代码 苍与红的试炼 题意 思路 代码 概述 数位 DP…

    算法与数据结构 2023年4月17日
    00
  • 深入解析MySQL索引数据结构

    深入解析MySQL索引数据结构 MySQL索引是优化查询效率的重要一环,本文将深入解析MySQL索引数据结构,帮助读者理解MySQL索引原理,并通过两个示例说明不同类型的索引在实际应用中的效果。 索引数据结构 MySQL支持两种类型的索引数据结构:B-Tree索引和Hash索引。 B-Tree索引 B-Tree索引是MySQL常用的索引类型,用于优化WHER…

    数据结构 2023年5月17日
    00
  • C语言数据结构之简易计算器

    C语言数据结构之简易计算器攻略 简介 这是一个基于C语言的简易计算器,可以实现加、减、乘、除四个基本运算。 实现步骤 首先,需要声明四个变量,分别表示运算符、被加数、被减数、被乘数和被除数。 char op; double n1, n2, result; 然后,需要通过scanf()函数获取用户输入的运算符和数字。 printf(“请输入运算符和数字:\n”…

    数据结构 2023年5月17日
    00
  • 数据结构TypeScript之二叉查找树实现详解

    数据结构TypeScript之二叉查找树实现详解 什么是二叉查找树 二叉查找树(Binary Search Tree,简称BST)是一种基础的数据结构,也是一种常用的搜索算法。它通过以二叉树的形式表示各个结点之间的关系,实现了快速查找、添加、删除等操作。对于任何一个节点,其左子树上的节点值均小于该节点的值,右子树上的节点值均大于该节点的值。 二叉查找树的实现…

    数据结构 2023年5月17日
    00
  • python数据结构学习之实现线性表的顺序

    下面我来详细讲解一下“python数据结构学习之实现线性表的顺序”的完整攻略。 一、线性表的概念介绍 线性表是最基本、最常用的一种数据结构。线性表是由同类型的数据元素构成有序序列的抽象,常用的线性表有顺序表和链表两种结构。 顺序表就是用一段连续的物理空间依次存储一组类型相同的数据元素,同时在存储空间中,逻辑上相邻的两个元素,物理位置也相邻。 二、实现顺序表的…

    数据结构 2023年5月17日
    00
  • Java数据结构最清晰图解二叉树前 中 后序遍历

    Java数据结构最清晰图解二叉树前 中 后序遍历 前言 二叉树是数据结构中至关重要的一种数据结构,对于计算机科学的学习和工作都是至关重要的。而遍历二叉树是二叉树的重要操作之一。 为了帮助读者更好地理解二叉树前、中、后序遍历的过程,本文介绍 Java 数据结构中最清晰的图解二叉树前、中、后序遍历攻略。 什么是二叉树? 二叉树是一种非常重要的数据结构,它由根节点…

    数据结构 2023年5月17日
    00
  • C语言超详细讲解数据结构中的线性表

    C语言超详细讲解数据结构中的线性表完整攻略 线性表的概念和基本操作 线性表是指由同类型的数据元素构成的有限序列。即每个数据元素只有一个前驱和一个后继。线性表通常用于表示一维数组、列表、队列等数据结构。 线性表的基本操作包括: 初始化操作:创建一个空的线性表。 插入操作:在线性表中插入一个元素。 删除操作:删除线性表中的一个元素。 查找操作:查找线性表中是否存…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部