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

      

     

  • 相关阅读:
    2018 ACM 网络选拔赛 徐州赛区
    2018 ACM 网络选拔赛 焦作赛区
    2018 ACM 网络选拔赛 沈阳赛区
    poj 2289 网络流 and 二分查找
    poj 2446 二分图最大匹配
    poj 1469 二分图最大匹配
    poj 3249 拓扑排序 and 动态规划
    poj 3687 拓扑排序
    poj 2585 拓扑排序
    poj 1094 拓扑排序
  • 原文地址:https://www.cnblogs.com/tanghulu321/p/3051746.html
Copyright © 2011-2022 走看看