leetcode104二叉树的最大深度

问题描述

问题是求一棵二叉树的深度,但结果一直是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_LT_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