二叉树的深度计算不理解?

图片里的这串代码是怎么计算深度的,这段代码写的 if(m>n )return (m+1 ), 但是这段代码上面的两段代码根本就没有 m++, n++类似的东西,怎么能得到他的深度呢,而且这段代码连 m 和 n 都没有定义?能讲一讲图片中的这个代码是怎么返回深度 4 的吗?我还画了个图也没想明白

img

img

使用了递归的思想。首先,当传入的节点 t 为空(即指向空节点或者已经到达叶子节点)时,返回深度 0。

对于非空节点,需要计算左子树和右子树的深度。通过递归调用 depth 函数来计算左子树的深度,将结果存储在变量 m 中。然后,再通过递归调用 depth 函数来计算右子树的深度,将结果存储在变量 n 中。

接下来比较 m 和 n 的值。如果 m 大于 n,则返回左子树的深度加一;否则,返回右子树的深度加一。

代码中并没有直接对 m 和 n 进行自增操作(m++ 或 n++),因为在每次递归调用中,m 和 n 的值都会被更新为各自子树的深度。

这不是有 return m+1 和 return n+1 么
这就相当于m++ n++ 了
这是递归,叶子节点返回0
倒数第二层,那么m或者n肯定至少一个是1,那么return +1就是2了
再上一层就是3
.。。。
m n 的确没有定义,因为这个代码是伪码,也就是说示意用的
要想成功编译,肯定要加上 int m = Depth(T->lchild); 这样的

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中的代码,我们可以看出,这段代码并不是用于计算二叉树的深度,而是用于寻找矩阵中的鞍点的行和列。

    关于二叉树的深度计算,我们需要了解二叉树以及递归的性质。

    首先,m和n是作为参数传入递归函数的,不需要在代码中进行自增操作。通常情况下,我们可以将m和n初始化为0,表示当前节点的深度为0。

    递归函数的作用是计算二叉树的深度,代码中的递归函数可能类似于下面的形式:

    int calculateDepth(TreeNode* node, int m, int n) {
        // 当前节点为NULL,返回深度为m的值
        if (node == NULL) {
            return m;
        }
    
        // 递归计算左子树的深度
        int leftDepth = calculateDepth(node->left, m + 1, n);
    
        // 递归计算右子树的深度
        int rightDepth = calculateDepth(node->right, m + 1, n);
    
        // 返回左右子树中的最大深度
        if (leftDepth > rightDepth) {
            return leftDepth;
        } else {
            return rightDepth;
        }
    }
    
    int getDepth(TreeNode* root) {
        // 调用递归函数,传入根节点和初始深度0
        int depth = calculateDepth(root, 0, 0);
        return depth;
    }
    

    这段代码使用递归的方式计算二叉树的深度,首先判断当前节点是否为空,如果为空,则返回当前深度m。否则,递归计算左子树和右子树的深度,取其中较大的一个作为当前节点的深度,并返回给上一层递归。

    通过调用getDepth函数,传入二叉树的根节点,即可得到二叉树的深度。

    希望以上解释能帮到你理解二叉树深度的计算方法。如果还有其他问题,请随时提问。


#include<bits/stdc++.h>
using namespace std;
class tree{
    public:
        int depth(int root)
        {
            if(root==0)
                return 0;
            return 1+max(depth(Tree[root].left),depth(Tree[root].right));
        }
        void inorder_traversal(int root)
        {
            if(root==0)
                return ;
            inorder_traversal(Tree[root].left);
            cout<<Tree[root].data<<" ";
            inorder_traversal(Tree[root].right);
        }
        void preorder_traversal(int root)
        {
            if(root==0)
                return ;
            cout<<Tree[root].data<<" ";
            preorder_traversal(Tree[root].left);
            preorder_traversal(Tree[root].right);
        }
        void postorder_traversal(int root)
        {
            if(root==0)
                return ;
            postorder_traversal(Tree[root].left);
            postorder_traversal(Tree[root].right);
            cout<<Tree[root].data<<" ";
        }
        void input(int left,int middle,int right)
        {
            Tree[middle].data=middle;
            Tree[middle].left=left;
            Tree[middle].right=right;
        }
        int find_root(int num)
        {
            int flag[100005]={0};
            for(int i=1;i<=num;i++)
            {
                flag[Tree[i].left]=1;
                flag[Tree[i].right]=1;
            }
            for(int i=1;i<=num;i++)
            {
                if(flag[i]==0)
                    return i;
            }
        }
    private:
        struct Tnode{
            int left,right,data;
        }Tree[100005];
};
int main(){
 
    return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632