C语言二叉树常见操作详解【前序,中序,后序,层次遍历及非递归查找,统计个数,比较,求深度】

C语言二叉树常见操作详解

什么是二叉树

二叉树是一种重要的数据结构,它由节点组成,每个节点最多有两个子节点,左子节点和右子节点。

二叉树具有以下性质:

  1. 每个节点最多有两个子节点。
  2. 左子节点的值小于父节点的值。
  3. 右子节点的值大于父节点的值。
  4. 左右子树都是二叉树。

二叉树的基本操作

1.创建一个二叉树

使用递归的方式来创建一个二叉树,每次创建节点时,递归创建左右子树。以下是一个示例代码:

typedef struct TreeNode{
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;

TreeNode* createBinaryTree(){
    int data;
    scanf("%d", &data);
    if(data == -1) {
        return NULL;
    }
    TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
    root->data = data;
    root->left = createBinaryTree();
    root->right = createBinaryTree();
    return root;
}

使用外部数据输入的方式来创建二叉树,当输入 -1 时,代表该节点为空。

2.前序遍历二叉树

前序遍历的顺序是:先访问根节点,再遍历左子树和右子树。以下是一个示例代码:

void preOrderTraverse(TreeNode* root){
    if(root!=NULL) {
        printf("%d ",root->data);
        preOrderTraverse(root->left);
        preOrderTraverse(root->right);
    }
}

例如,对于下图所示的二叉树:

     1
   /   \
  2     3
 / \   / \
4   5  6  7

它的前序遍历结果为: 1 2 4 5 3 6 7

3.中序遍历二叉树

中序遍历的顺序是:先遍历左子树,再访问根节点,最后遍历右子树。以下是一个示例代码:

void inOrderTraverse(TreeNode* root){
    if(root!=NULL) {
        inOrderTraverse(root->left);
        printf("%d ",root->data);
        inOrderTraverse(root->right);
    }
}

例如,对于下图所示的二叉树:

     1
   /   \
  2     3
 / \   / \
4   5  6  7

它的中序遍历结果为: 4 2 5 1 6 3 7

4.后序遍历二叉树

后序遍历的顺序是:先遍历左子树,再遍历右子树,最后访问根节点。以下是一个示例代码:

void postOrderTraverse(TreeNode* root){
    if(root!=NULL) {
        postOrderTraverse(root->left);
        postOrderTraverse(root->right);
        printf("%d ",root->data);
    }
}

例如,对于下图所示的二叉树:

     1
   /   \
  2     3
 / \   / \
4   5  6  7

它的后序遍历结果为: 4 5 2 6 7 3 1

5.层次遍历二叉树

层次遍历的顺序是:按照从上往下、从左往右的方式,逐层遍历每一个节点。以下是一个示例代码:

void levelOrderTraverse(TreeNode* root){
    if(root == NULL){
        return;
    }
    Queue q;
    initQueue(&q);
    enqueue(&q, root);
    while(!isEmpty(&q)){
        TreeNode* node = dequeue(&q);
        printf("%d ", node->data);
        if(node->left != NULL) enqueue(&q, node->left);
        if(node->right != NULL) enqueue(&q, node->right);
    }
}

其中,使用队列来存储每一层的节点队列,先将根节点入队,之后每次出队一个节点并输出,再将该节点的左右子节点入队。

例如,对于下图所示的二叉树:

     1
   /   \
  2     3
 / \   / \
4   5  6  7

它的层次遍历结果为: 1 2 3 4 5 6 7

6.非递归查找

使用非递归的方式,从根节点开始查找二叉树中是否存在某个节点。以下是一个示例代码:

TreeNode* find(TreeNode* root, int val){
    if(root == NULL) return NULL;
    Stack s;
    initStack(&s);
    push(&s, root);
    while(!isEmptyStack(&s)){
        TreeNode* node = top(&s); pop(&s);
        if(node->data == val) return node;
        if(node->right != NULL) push(&s, node->right);
        if(node->left != NULL) push(&s, node->left);
    }
    return NULL;
}

其中,使用栈来存储每一个节点,先将根节点入栈,之后每次取出一个节点并比较,如果相等则返回该节点,否则将其右子节点和左子节点入栈。

7.统计节点个数

统计二叉树中节点的个数,包括根节点和左右子树中的所有节点。以下是一个示例代码:

int count(TreeNode* root){
    if(root == NULL) return 0;
    return count(root->left) + count(root->right) + 1;
}

其中,使用递归的方式遍历每一个节点,并计数。

8.二叉树比较

比较两个二叉树是否相同,相同返回 true,否则返回 false。以下是一个示例代码:

bool isEqual(TreeNode* root1, TreeNode* root2){
    if(root1 == NULL && root2 == NULL) return true;
    if(root1 == NULL || root2 == NULL) return false;
    if(root1->data != root2->data) return false;
    return isEqual(root1->left, root2->left) && isEqual(root1->right, root2->right);
}

其中,使用递归的方式分别比较两个二叉树的根节点、左子树和右子树。

9.求二叉树深度

求二叉树的深度,即二叉树的最大深度。以下是一个示例代码:

int maxDepth(TreeNode* root){
    if(root == NULL) return 0;
    int left = maxDepth(root->left);
    int right = maxDepth(root->right);
    return left > right ? left + 1 : right + 1;
}

其中,使用递归的方式分别求左子树和右子树的深度,并加上根节点的深度 1,最后返回较大值。

示例说明

示例一

我们输入以下数据:

1
2
4
-1
-1
5
-1
-1
3
6
-1
-1
7
-1
-1

使用示例代码中的 createBinaryTree() 方法,得到以下的二叉树:

     1
   /   \
  2     3
 / \   / \
4   5  6  7

使用示例代码中的各种遍历、查找、比较、求深度等方法可以对该二叉树进行各种操作。

示例二

我们输入以下数据:

1
-1
2
-1
3
-1

使用示例代码中的 createBinaryTree() 方法,得到以下的二叉树:

  1
   \
    2
     \
      3

使用示例代码中的各种遍历、查找、比较、求深度等方法可以对该二叉树进行各种操作,例如:

  • 中序遍历结果: 1 2 3
  • 非递归查找 4,结果为 NULL
  • 统计节点个数为 3
  • 求深度为 3

总结

二叉树是一种常用的数据结构,常用的操作包括创建、遍历、查找、比较和求深度等。掌握这些基本操作后,可根据实际需求进行扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言二叉树常见操作详解【前序,中序,后序,层次遍历及非递归查找,统计个数,比较,求深度】 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • WebStorm(Amaze开发工具)–JavaScript 开发工具

    WebStorm(Amaze开发工具)–JavaScript 开发工具的完整攻略 WebStorm是一款由JetBrains开发的JavaScript开发工具,提供了丰富的功能和工具,包括代码自动补全、调试、版本控制等。本文将详细讲解WebStorm的使用方法和功能,包括两个示例说明。 WebStorm的安装和配置 WebStorm的安装和配置非常简单,只…

    other 2023年5月5日
    00
  • PHP读取目录树的实现方法分析

    下面就是详细讲解“PHP读取目录树的实现方法分析”的完整攻略。 什么是目录树 目录树是指计算机文件系统中,按照层级关系形成的一棵树形结构。在文件系统中,每个目录都可以包含文件和其他目录,因此可以将文件系统看作是一棵由目录和文件组成的树,每个目录都是这个树的一个节点,而叶子节点则是文件。 PHP读取目录树的实现方法分析 PHP 读取目录树的实现方法有许多种,常…

    other 2023年6月26日
    00
  • Java Lambda表达式的方法引用和构造器引用实例分析

    Java Lambda表达式的方法引用和构造器引用实例分析 1. 方法引用(Method Reference)的概念 方法引用是Lambda表达式的一种简化形式,它允许我们直接通过方法的名称来引用已经存在的方法。 2. 方法引用的用法 方法引用可以分为四种不同的形式: 2.1 指向静态方法的方法引用 语法:类名::静态方法名 示例: import java.…

    other 2023年6月28日
    00
  • 用VBS将一篇txt后缀的内容保存为html格式

    当使用VBS(Visual Basic Script)将一个txt文件保存为html格式时,可以按照以下步骤进行操作: 创建一个新的VBS文件:首先,打开任意文本编辑器(例如记事本)并创建一个新的文件。将文件保存为.vbs文件扩展名(例如,save_as_html.vbs)。 打开txt文件并读取内容:在VBS文件中,使用FileSystemObject对象…

    other 2023年8月5日
    00
  • npm下载指定版本的组件方法

    以下是npm下载指定版本的组件方法的完整攻略: 1. 查看可用版本 在下载指定版本的组件之前,我们需要查看可用的版本。使用以下命令查看可用版本: npm view <package-name> versions 例如,查看“react”组件的可用版本,使用以下命令: npm view react versions 2. 下载指定版本 要下载指定版…

    other 2023年5月8日
    00
  • 详解如何清理Redis内存碎片

    详解如何清理Redis内存碎片 Redis是一种常用的内存数据库,但长时间运行后可能会产生内存碎片,导致内存使用效率下降。本攻略将详细介绍如何清理Redis内存碎片。 步骤一:查看内存碎片情况 首先,我们需要查看Redis的内存碎片情况。可以使用Redis的命令MEMORY STATS来获取内存统计信息。在Redis的命令行界面中执行以下命令: MEMORY…

    other 2023年8月2日
    00
  • WiFi万能钥匙在哪查看版本号?WiFi万能钥匙查看版本号教程

    WiFi万能钥匙版本号查看攻略 WiFi万能钥匙是一款常用的无线网络连接工具,它提供了方便的WiFi连接服务。如果你想查看WiFi万能钥匙的版本号,可以按照以下步骤进行操作: 打开WiFi万能钥匙应用:在你的手机上找到并点击WiFi万能钥匙应用的图标,以打开应用。 进入设置界面:在WiFi万能钥匙的主界面上,通常会有一个设置图标,一般是一个齿轮状的图标。点击…

    other 2023年8月3日
    00
  • Oracle客户端的安装与远程连接配置方法分享

    下面我就详细讲解一下“Oracle客户端的安装与远程连接配置方法分享”的完整攻略。 安装Oracle客户端 首先,到Oracle官网下载适合自己操作系统和Oracle版本的客户端压缩包。 解压下载的客户端文件至任意目录,例如 C:\oracle。 配置环境变量:将 C:\oracle 添加至系统环境变量中的 PATH 变量中。 配置客户端远程连接 通过 tn…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部