|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "二叉树的最大深度深度优先搜索算法DFSDepth-First-Search" |
| 4 | +date: 2024-04-26T16:19:09+0800 |
| 5 | +description: "左子树的最大深度为2(节点4和2),右子树的最大深度为0(因为它为空)。左子树的最大深度为0(因为它为空),右子树的最大深度为2(节点5和3)。在这个例子中,左子树和右子树的最大深度都是2,所以树的最大深度为3。在这个例子中,左子树的根节点是2,右子树的根节点是3。这是因为节点的深度定义为从根节点到该节点的最长路径的长度。:我们首先检查根节点。,其中height是树的高度,这是因为在递归过程中,我们需要使用栈空间,而栈的深度等于树的高度。:在遍历完整棵树后,我们返回根节点的深度,这就是整棵树的最大深度。" |
| 6 | +keywords: "最大深度算法" |
| 7 | +categories: ['未分类'] |
| 8 | +tags: ['深度优先'] |
| 9 | +artid: "138222517" |
| 10 | +arturl: "https://blog.csdn.net/qiuchangxingfiber/article/details/138222517" |
| 11 | +image: |
| 12 | + path: https://api.vvhan.com/api/bing?rand=sj&artid=138222517 |
| 13 | + alt: "二叉树的最大深度深度优先搜索算法DFSDepth-First-Search" |
| 14 | +render_with_liquid: false |
| 15 | +featuredImage: https://bing.ee123.net/img/rand?artid=138222517 |
| 16 | +featuredImagePreview: https://bing.ee123.net/img/rand?artid=138222517 |
| 17 | +cover: https://bing.ee123.net/img/rand?artid=138222517 |
| 18 | +img: https://bing.ee123.net/img/rand?artid=138222517 |
| 19 | +--- |
| 20 | + |
| 21 | + |
| 22 | + |
| 23 | +# 二叉树的最大深度(深度优先搜索算法(DFS:Depth-First Search)) |
| 24 | + |
| 25 | + |
| 26 | + |
| 27 | +求给定二叉树的最大深度, |
| 28 | + |
| 29 | +深度是指树的根节点到任一叶子节点路径上节点的数量。 |
| 30 | + |
| 31 | +最大深度是所有叶子节点的深度的最大值。 |
| 32 | + |
| 33 | +(注:叶子节点是指没有子节点的节点。) |
| 34 | + |
| 35 | +数据范围:0≤n≤1000000 , 树上每个节点的val满足 ∣val∣≤100 |
| 36 | + |
| 37 | +要求: 空间复杂度 O(1),时间复杂度 O(n) |
| 38 | + |
| 39 | +示例1 |
| 40 | + |
| 41 | +输入 |
| 42 | + |
| 43 | +{1,2} |
| 44 | + |
| 45 | +输出 |
| 46 | + |
| 47 | +2 |
| 48 | + |
| 49 | +示例2 |
| 50 | + |
| 51 | +输入 |
| 52 | + |
| 53 | +{1,2,3,4,#,#,5} |
| 54 | + |
| 55 | +输出 |
| 56 | + |
| 57 | +3 |
| 58 | + |
| 59 | +****#include <algorithm> // 引入algorithm库,用于使用max函数**** |
| 60 | + |
| 61 | +****#include <cstddef> // 引入cstddef库,用于使用NULL和size_t**** |
| 62 | + |
| 63 | +****struct TreeNode { // 定义二叉树的节点结构**** |
| 64 | + |
| 65 | +****int val; // 节点的值**** |
| 66 | + |
| 67 | +****TreeNode *left; // 左子节点**** |
| 68 | + |
| 69 | +****TreeNode *right; // 右子节点**** |
| 70 | + |
| 71 | +****TreeNode(int x) : val(x), left(NULL), right(NULL) {} // 节点的构造函数**** |
| 72 | + |
| 73 | +****};**** |
| 74 | + |
| 75 | +****int maxDepth(TreeNode* root) {**** |
| 76 | + |
| 77 | +****if (root == NULL) { // 如果节点为空,那么深度为0**** |
| 78 | + |
| 79 | +****return 0;**** |
| 80 | + |
| 81 | +****} else { // 如果节点不为空**** |
| 82 | + |
| 83 | +****int left_depth = maxDepth(root->left); // 递归计算左子树的最大深度**** |
| 84 | + |
| 85 | +****int right_depth = maxDepth(root->right); // 递归计算右子树的最大深度**** |
| 86 | + |
| 87 | +****return std::max(left_depth, right_depth) + 1; // 返回左右子树最大深度的较大值+1**** |
| 88 | + |
| 89 | +****}**** |
| 90 | + |
| 91 | +****}**** |
| 92 | + |
| 93 | +以例子{1,2,3,4,#,#,5}为例。 |
| 94 | + |
| 95 | +首先,让我们理解一下这个二叉树的结构。这是一个前序遍历的结果,其中"#"表示空节点。所以,这个二叉树的结构如下: |
| 96 | + |
| 97 | + 1 |
| 98 | + |
| 99 | + / \ |
| 100 | + |
| 101 | + 2 3 |
| 102 | + |
| 103 | + / \ |
| 104 | + |
| 105 | +4 5 |
| 106 | + |
| 107 | +现在,我们来看看如何计算这个二叉树的最大深度。 |
| 108 | + |
| 109 | +****初始化****:我们首先检查根节点。如果根节点为空,那么树的最大深度就是0。在这个例子中,根节点是1,所以它不为空。 |
| 110 | + |
| 111 | +****递归计算子树的最大深度****:我们分别计算左子树和右子树的最大深度。这是通过递归调用maxDepth函数实现的。在这个例子中,左子树的根节点是2,右子树的根节点是3 |
| 112 | + |
| 113 | +对于左子树,我们继续递归计算它的左子树(根节点为4)和右子树(为空)。左子树的最大深度为2(节点4和2),右子树的最大深度为0(因为它为空)。所以,左子树的最大深度为2。 |
| 114 | + |
| 115 | +对于右子树,我们继续递归计算它的左子树(为空)和右子树(根节点为5)。左子树的最大深度为0(因为它为空),右子树的最大深度为2(节点5和3)。所以,右子树的最大深度为2。 |
| 116 | + |
| 117 | +****计算最大深度****:最后,我们取左子树和右子树最大深度的较大值,然后加1(加上根节点)。在这个例子中,左子树和右子树的最大深度都是2,所以树的最大深度为3。 |
| 118 | + |
| 119 | +这个问题的解决方案使用了****深度优先搜索****(Depth-First Search,DFS)算法。 |
| 120 | + |
| 121 | +深度优先搜索是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。 |
| 122 | + |
| 123 | +在这个问题中,我们的目标是找到二叉树的最大深度。我们可以通过深度优先搜索来解决这个问题,具体步骤如下: |
| 124 | + |
| 125 | +****递归****:我们使用递归来实现深度优先搜索。对于每个节点,我们计算它的左子树和右子树的最大深度。 |
| 126 | + |
| 127 | +****计算深度****:对于每个节点,其深度等于其左子树和右子树的最大深度加1。这是因为节点的深度定义为从根节点到该节点的最长路径的长度。 |
| 128 | + |
| 129 | +****返回结果****:在遍历完整棵树后,我们返回根节点的深度,这就是整棵树的最大深度。 |
| 130 | + |
| 131 | +这个算法的时间复杂度是****O(n)****,因为我们访问了每个节点一次。空间复杂度是****O(height)****,其中height是树的高度,这是因为在递归过程中,我们需要使用栈空间,而栈的深度等于树的高度。 |
| 132 | + |
| 133 | +这个算法之所以有效,是因为它能够遍历整棵树,并在遍历过程中计算出每个节点的深度。通过比较所有节点的深度,我们就可以找到树的最大深度。 |
| 134 | + |
| 135 | + |
| 136 | + |
0 commit comments