剑指offer之二叉树的深度(C++/Java双重实现)

1.问题描述

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7]
在这里插入图片描述
返回它的最大深度 3 。

2.问题分析

参考题解面试题55 - I. 二叉树的深度(后序遍历、层序遍历,清晰图解)

我是用后序遍历解答此题。
树的后序遍历 / 深度优先搜索往往利用 递归 或 栈 实现,本文使用递归实现。
关键点: 此树的深度和其左(右)子树的深度之间的关系。显然,此树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 +1+1 。如:
在这里插入图片描述
算法解析:
终止条件: 当 root​ 为空,说明已越过叶节点,因此返回 深度 00 。
递推工作:本质上是对树做后序遍历。
1.计算节点 root​ 的 左子树的深度 ,即调用 maxDepth(root.left);
2.计算节点 root​ 的 右子树的深度 ,即调用 maxDepth(root.right);
3.返回值: 返回 此树的深度 ,即 max(maxDepth(root.left), maxDepth(root.right)) + 1。
看一组实现图片:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.代码实现

3.1C++代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==NULL)
        return 0;
        int lenLeft = maxDepth(root->left) + 1;
        int lenRight = maxDepth(root->right) + 1;
        if(lenLeft>lenRight)
        return lenLeft;
        return lenRight;
    }
};

3.2Java代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null)
        return 0;
        int lenleft=maxDepth(root.left)+1;
        int lenright=maxDepth(root.right)+1;
        if(lenleft>=lenright)
        return lenleft;
        return lenright;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/107771703