zoukankan      html  css  js  c++  java
  • Maximum Depth of Binary Tree

    题目: 

    Given a binary tree, find its maximum depth.

    The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

    思路1: We can solve this easily using recursion. Why? Because each of the leftChild and rightChild of a node is a sub-tree itself. We first compute the max height of left sub-tree, then compute the max height of right sub-tree. Therefore, the max height of the current node is the greater of the two max heights + 1. For the base case, the current node is NULL, we return zero. NULL signifies there is no tree, therefore its max height is zero.

    代码:(DFS--迭代):

    class Solution {
    public:
        int maxDepth(TreeNode *root) {
        
            if(root == NULL) return 0;
            return 1 + max(maxDepth(root->left), maxDepth(root->right));
        }
    };
    

     或者用下面一种比较笨的方法来在遍历的过程中更新最大class Solution {

    public:
        
        void helper(TreeNode *root, int count, int &maxDep){
            
            if (root == NULL) maxDep = max(count, maxDep);
            
            else{
                
                count+=1;
                helper(root->left, count, maxDep);
                helper(root->right, count, maxDep);
            } 
        }
        
        int maxDepth(TreeNode *root) {
            
            if (root == NULL) return 0;
            
            int maxDep = 0;
            int count = 0;
            helper(root, count, maxDep);
            return maxDep;
        }

    思路2: 对于iteratively的解法,我们有三种解法:pre-order, in-order, and post-order all as DFS. 前序遍历和中序遍历更容易实现,但是有可能会在一个node被pop出stack的时候在这个node上面几层跳出循环。但是后序遍历可以保证在一个node被pop出去的时候返回恰好这个node上面一层。所以我们可以用后序遍历来做这个题。We keep track of the current depth and update the maximum depth as we traverse the tree.

    代码:

    class Solution {
    public:
        int maxDepth(TreeNode *root) {
        
            if(root == NULL) return 0;
            stack<TreeNode*> s;
            
            s.push(root);
            int maxDep = 0;
            TreeNode *prev = NULL;
            while(!s.empty()){
                
                TreeNode* curr = s.top();
                if (!prev || prev->left == curr || prev->right == curr){
                    
                    if (curr->left) s.push(curr->left);
                    else if (curr->right) s.push(curr->right);
                }
                
                else if (curr->left == prev){
                    
                    if (curr->right) s.push(curr->right);
                }
                
                else s.pop();
                
                prev = curr;
                
                if (s.size()>maxDep) maxDep = s.size();
            }  
             
        return maxDep;
        }
    };

    思路3:第三种解法是BFS, BFS的解法可以很直观。每次一层结束的时候就把层数加一。 重点是queue和每一层节点数的记录。

    代码:

    class Solution {
    public:
        int maxDepth(TreeNode *root) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if( root == NULL) return 0;
    
        queue<TreeNode*> q;
        q.push(root);
        
        int count = q.size();
        int maxDep = 0;
        
        while(!q.empty())
        {
            count--;
            if( count == 0 )
                maxDep++;
            TreeNode* p = q.front();
            q.pop();
            if( p->left)  q.push(p->left);
            
            if( p->right )  q.push(p->right);
            
            if( count == 0 ) count = q.size();
        }
        
        return maxDep;
    }
    };
    

      

     

  • 相关阅读:
    Python之Numpy详细教程
    poj-1151-Atlantis-线段树求面积并
    hdu 5277 YJC counts stars
    webpack安装和配置
    算法——基础篇——高速排序
    nyoj914(二分搜索+贪心)
    Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix
    我是怎么利用微信做兼职月入1W的
    对象逆序列化报错:java.lang.ClassNotFoundException
    输入法之核心词典构建
  • 原文地址:https://www.cnblogs.com/tanghulu321/p/3051746.html
Copyright © 2011-2022 走看看