LeetCode104 二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

 


 

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
/*
算法思想:
    我们知道,树可以以递归的方式定义为一个节点(根节点),它包括一个值和一个指向其他节点指针的列表。 递归是树的特性之一。 因此,许多树问题可以通过递归的方式来解决。 对于每个递归层级,我们只能关注单个节点内的问题,并通过递归调用函数来解决其子节点问题。通常,我们可以通过 “自顶向下” 或 “自底向上” 的递归来解决树问题。
    “自顶向下” 意味着在每个递归层级,我们将首先访问节点来计算一些值,并在递归调用函数时将这些值传递到子节点。 所以 “自顶向下” 的解决方案可以被认为是一种前序遍历。
    我们知道根节点的深度是1。 对于每个节点,如果我们知道某节点的深度,那我们将知道它子节点的深度。 因此,在调用递归函数的时候,将节点的深度传递为一个参数,那么所有的节点都知道它们自身的深度。 而对于叶节点,我们可以通过更新深度从而获取最终答案。
*/
//算法实现:
/*
int answer;               // don't forget to initialize answer before call maximum_depth
void maximum_depth(TreeNode* root, int depth) {
    if (!root) {
        return;
    }
    if (!root->left && !root->right) {
        answer = max(answer, depth);
    }
    maximum_depth(root->left, depth + 1);
    maximum_depth(root->right, depth + 1);
}
*/
/*
算法思想:
    “自底向上” 是另一种递归方法。 在每个递归层次上,我们首先对所有子节点递归地调用函数,然后根据返回值和根节点本身的值得到答案。 这个过程可以看作是后序遍历的一种。
*/
//算法实现:
/*
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (!root) {
            return 0;                                
        }
        int left_depth = maxDepth(root->left);
        int right_depth = maxDepth(root->right);
        return max(left_depth, right_depth) + 1;      
    }
};
*/


/*
算法思想:
    也可以使用层序遍历二叉树,然后计数总层数,即为二叉树的最大深度。
*/
//算法实现:
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (!root) 
            return 0;
        int res = 0;
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            ++res;  //遍历一层结果+1
            int n = q.size();
            for (int i = 0; i < n; ++i) {   //遍历每一层
                TreeNode *t = q.front(); 
                q.pop();
                if (t->left) 
                    q.push(t->left);
                if (t->right) 
                    q.push(t->right);
            }
        }
        return res;
    }
};

猜你喜欢

转载自www.cnblogs.com/parzulpan/p/10059605.html