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;
}
};

  

 

原文链接: https://www.cnblogs.com/tanghulu321/archive/2013/04/30/3051746.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    Maximum Depth of Binary Tree

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/86607

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午10:40
下一篇 2023年2月9日 下午10:40

相关推荐