C语言实现计算树的深度的方法

yizhihongxing

C语言实现计算树的深度的方法

计算树的深度是树的常见操作之一,它是指从根节点到叶子节点的最长路径上的节点数。本文将介绍如何使用C语言实现计算树的深度的方法。

1. 递归法

递归法是树的常见遍历方法,计算树的深度也可以使用递归法来实现。递归法的思想是将树的每个子树的深度计算出来,然后取最大值加1,即为整棵树的深度。

具体实现方法如下:

int maxDepth(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }
    int leftDepth = maxDepth(root->left);
    int rightDepth = maxDepth(root->right);
    return max(leftDepth, rightDepth) + 1;
}

解释一下代码:

  1. 如果给定的根节点指针为NULL,则返回0,因为空树的深度为0;
  2. 否则,递归计算左子树和右子树的深度,得到leftDepth和rightDepth;
  3. 将leftDepth和rightDepth中的较大值加1,即为整棵树的深度。

2. 迭代法

除了递归法,我们还可以使用迭代法来计算树的深度。迭代法的基本思路是用队列来保存每一层的节点,并对每一层的节点进行遍历。每遍历一层,深度加1。遍历完最后一层,即为整棵树的深度。

具体实现方法如下:

int maxDepth(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }
    int depth = 0;
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
        depth++;
        int len = q.size();
        for (int i = 0; i < len; i++) {
            TreeNode* node = q.front();
            q.pop();
            if (node->left != NULL) {
                q.push(node->left);
            }
            if(node->right != NULL) {
                q.push(node->right);
            }
        }
    }
    return depth;
}

解释一下代码:

  1. 如果给定的根节点指针为NULL,则返回0,因为空树的深度为0;
  2. 否则,定义一个整数变量depth,用来保存树的深度;
  3. 定义一个队列q,用来保存每一层的节点;
  4. 将根节点加入队列中,并将depth加1;
  5. 当队列不为空时,循环计算每一层的节点,并遍历它们的子节点;
  6. 当遍历完当前层的所有节点后,将depth加1,指向下一层;
  7. 最后返回depth,即为整棵树的深度。

3. 示例说明

示例1

以下是一棵二叉树:

    3
   / \
  9  20
    /  \
   15   7

使用递归法计算树的深度:

int maxDepth(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }
    int leftDepth = maxDepth(root->left);
    int rightDepth = maxDepth(root->right);
    return max(leftDepth, rightDepth) + 1;
}

输出结果:

3

使用迭代法计算树的深度:

int maxDepth(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }
    int depth = 0;
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
        depth++;
        int len = q.size();
        for (int i = 0; i < len; i++) {
            TreeNode* node = q.front();
            q.pop();
            if (node->left != NULL) {
                q.push(node->left);
            }
            if(node->right != NULL) {
                q.push(node->right);
            }
        }
    }
    return depth;
}

输出结果:

3

示例2

以下是一棵普通树:

       1
     / | \
    2  3  4
   / \
  5   6

使用递归法计算树的深度:

int maxDepth(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }
    int maxDep = 0;
    for (TreeNode* child : root->children) {
        int dep = maxDepth(child);
        if (dep > maxDep) {
            maxDep = dep;
        }
    }
    return maxDep + 1;
}

输出结果:

3

使用迭代法计算树的深度:

int maxDepth(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }
    int depth = 0;
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
        depth++;
        int len = q.size();
        for (int i = 0; i < len; i++) {
            TreeNode* node = q.front();
            q.pop();
            for (TreeNode* child : node->children) {
                if (child != NULL) {
                    q.push(child);
                }
            }
        }
    }
    return depth;
}

输出结果:

3

以上就是C语言实现计算树的深度的方法的详细讲解!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现计算树的深度的方法 - Python技术站

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

相关文章

  • C++ 智能指针深入解析

    C++ 智能指针深入解析 什么是智能指针? 在C++中,一个指针指向某个变量,但是由于指针是”裸”的,需要程序员显式地管理其生命周期。为了解决这个问题,C++11引入了智能指针。智能指针的用法和裸指针类似,但是会自动管理指针所指对象的生命周期。 智能指针的分类 C++中常用的智能指针有三种,它们分别是: unique_ptr:独占所有权的智能指针 share…

    C 2023年5月22日
    00
  • java程序设计语言的优势及特点

    Java程序设计语言的优势及特点 Java是一种业界广泛使用的高级编程语言,具有许多优点和特点,如下所示: 1.可移植性强 Java程序可以在不同的平台和操作系统中运行,这是因为Java虚拟机(JVM)能够将Java程序的字节码解释成线程可执行代码。因此,Java程序只需要编译一次就可以在不同的平台和操作系统中运行,这大大降低了开发成本和维护成本,提高了开发…

    C 2023年5月22日
    00
  • C++的程序流程结构你了解多少

    C++程序的流程结构是指程序的执行顺序和执行条件,程序流程结构分为顺序结构、选择结构和循环结构。 顺序结构 顺序结构是C++程序中最简单的结构,它是指按顺序执行的结构。当程序中只有一条语句时,就是顺序结构。 示例1: #include <iostream> using namespace std; int main() { // 输出Hello …

    C 2023年5月23日
    00
  • C语言之system函数案例详解

    C语言之system函数案例详解 简介 system函数是C语言标准库中较为常见的一个函数,它能够执行系统命令,并返回运行结果。 system函数的原型为:int system(const char *command)。它接收一个字符串参数,该字符串为要运行的系统命令。 当调用system函数时,会打开一个新的shell进程,并在该进程中执行指定的系统命令。…

    C 2023年5月23日
    00
  • C语言一个函数如何实现好几个return返回值

    在C语言中,一个函数可以实现多个return返回值,主要是通过条件分支语句来实现的。通常在编写函数时,我们需要在不同的条件下返回不同的值。下面是我总结的实现方法和示例。 实现方法 实现一个函数有多个返回值可以采用以下三种方法: 全部使用if/else的方式进行判断,每个分支在结尾return不同的值; 使用switch语句,每个case分支在结尾return…

    C 2023年5月23日
    00
  • c语言实现顺序表的基本操作

    下面就为大家详细讲解“C语言实现顺序表的基本操作”的完整攻略。 1. 什么是顺序表? 顺序表是一种线性结构,其存储单元在物理上也是连续的,它可以用数组实现,具有随机存取的特征。顺序表最大的特点是能够快速的查找指定位置上的元素,但是插入或删除操作常常需要移动大量元素,效率较低。 2. 顺序表的基本操作 顺序表的基本操作包括插入、删除、查找、修改、遍历等操作。接…

    C 2023年5月23日
    00
  • C++实现教务管理系统

    C++实现教务管理系统攻略 1. 简介 教务管理系统是学校行政管理的重要组成部分,方便教务管理人员进行课程管理、考试管理、成绩管理、学籍管理等工作。C++作为一种高级编程语言,具有良好的可移植性、强大的数据处理能力和较高的运行效率,适合用于教务管理系统的开发。 本文将介绍如何使用C++编程语言实现教务管理系统的开发,包括如何进行需求分析、系统设计、数据结构选…

    C 2023年5月23日
    00
  • 如何快速辨别USB Type-C数据线的好与坏?

    当购买USB Type-C数据线时,要注意以下几点: 步骤一:看外观 数据线的外观可以直接反映其质量。一般而言,好的USB Type-C数据线的线材会采用高质量的材料,比如高纯度铜线或高密度尼龙编织线,手感较为舒适,并且线料表面会进行人性化的设计,如添加防滑纹路。此外,好的USB Type-C数据线会采用高质量的接头,面料通常会采用金属材质,防止耐用性下降。…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部