问题描述
问题是求一棵二叉树的深度,但结果一直是depth==0。谁能帮忙找出我的代码哪里出了问题?非常感谢!
问题是:** 给定一个二叉树的根,返回它的最大深度。 二叉树的最大深度是从根节点到最远叶节点的最长路径上的节点数。**
public:
void dfs(TreeNode* root,int depth,int c){
c++;
if(root->left==nullptr and root->right==nullptr){
if (depth<=c){
depth=c;
}
}
else if (root->left !=nullptr or root->right!=nullptr){
dfs(root->left,depth,c);
dfs(root->right,c);
}
c-=c;
}
int maxDepth(TreeNode* root) {
int depth=0;
int c=0;
dfs(root,c);
return depth;
}
};
解决方法
这个算法可以被认为是下面的递归定义
令 T
为有根二叉树。 MaxDepth(T) = 0
如果 T
为空。然后,如果 T
不是叶子,则 MaxDepth(T) = 1 + max(MaxDepth(T_L),MaxDepth(T_R))
其中 T_L
和 T_R
分别是左子树和右子树。
您似乎已经从您的代码中认识到了这一事实,这很棒。您正在执行 DFS 并在执行遍历时跟踪深度,返回每个阶段的深度。 (我对您在此行 c-=c;
上使用的逻辑有点怀疑,但这不是大问题)。
您的算法的主要问题似乎是您在任何时候都没有从 DFS 返回值。您只需对树执行 DFS 搜索,跟踪每个点的深度,并在通过递归树向上移动时减去。如果您通过引用传递参数,这可能没问题,但除非我弄错了,否则这是 C++ 并且您是通过值传递参数。因此,当您在函数调用中赋值时,您实际上并没有访问同一个变量,只是它的一个副本,它不会传播到您的调用函数。
一些可用的 C++ 代码是一种实现方法:
#include <algorithm>
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
int left_depth = maxDepth(root->left);
int right_depth = maxDepth(root->right);
return 1 + std::max(left_depth,right_depth);
}
此代码将为单个根节点返回 1
,为空树返回 0
。
要通过引用传递,需要在参数名称前放置一个 &
。希望此链接将有助于您理解参数传递。 https://www.cs.fsu.edu/~myers/c++/notes/references.html