zoukankan      html  css  js  c++  java
  • 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 == NULL) 
                return 0;
            if (root->left == NULL && root->right == NULL) 
                return 1;
            
            if (root->left == NULL) //若左子树为空,则返回右子树的深度,反之返回左子树的深度
                return maxDepth(root->right) + 1;
            else if (root->right == NULL) 
                return maxDepth(root->left) + 1;
            else    ////如果都不为空,则返回左子树和右子树深度的最大值
                return max(maxDepth(root->left), maxDepth(root->right)) + 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;
        }
    };*/
  • 相关阅读:
    nodeJS 菜鸟入门
    Chrome 鲜为人知的秘籍(内部协议)&&Chrome功能指令大全
    前端工作面试问题
    ECharts模块化使用5分钟上手
    AppCan 之初体验
    Phonegap 环境配置
    【位运算】判断一个数是否为2的n次方
    【位运算】移位操作实现乘法运算
    O(1)时间复杂度求栈中最小元素
    Java Socket UDP编程
  • 原文地址:https://www.cnblogs.com/parzulpan/p/10059605.html
Copyright © 2011-2022 走看看