sundeepblue
3/19/2014 - 1:06 AM

Minimum and Maximum Depth of Binary Tree

Minimum and Maximum Depth of Binary Tree

// ===================================================================
// recursive version
int minimum_depth(TreeNode *root) {
    if(!root) return 0;
    if(!root->left && !root->right) return 1;
    int minHL = minimum_depth(root->left), minHR = minimum_depth(root->right);
    if(!root->left && root->right) return 1+minHR;
    if(root->left && !root->right) return 1+minHL;
    return 1 + min(minHR, minHL);
}
// ===================================================================
// iterative version, BFS
int minDepth(TreeNode *root) {
    if(!root) return 0;
    if(!root->left && !root->right) return 1;
    queue<TreeNode*> q;
    q.push(root);
    int min_depth = 1, level1 = 1, level2 = 0;
    while(!q.empty()) {
        TreeNode *cur = q.front();
        q.pop();
        level1--;
        // if(!cur) continue; // wrong!! cannot write like this. otherwise, POS1 cannot be executed.
        if(cur) {
            if(!cur->left && !cur->right) return min_depth;
            q.push(cur->left);
            q.push(cur->right);
            level2 += 2;
        }
        if(level1 == 0) { // POS1
            level1 = level2;
            min_depth++;
            level2 = 0;
        }
    }
    return min_depth;
}

// ===================================================================
// better iterative version!
int minDepth(TreeNode *root) {
  if(!root) return 0;
  if(!root->left && !root->right) return 1;
  queue<TreeNode*> q;
  q.push(root);
  int min_depth = 1, level1 = 1, level2 = 0;
  while(!q.empty()) {
    TreeNode *cur = q.front();
    q.pop();
    level1--;
    if(!cur->left && !cur->right) return min_depth;
    if(cur->left) { q.push(cur->left); level2++; }
    if(cur->right) { q.push(cur->right); level2++; }
    if(level1 == 0) { // POS1
      level1 = level2;
      min_depth++;
      level2 = 0;
    }
  }
  return min_depth;
}

// ===================================================================
int maximum_depth(TreeNode* root)
{
	if(root == NULL) return 0;
	int lh = maximum_depth(root->left);
	int rh = maximum_depth(root->right);
	return (lh > rh) ? (lh + 1) : (rh + 1);
}