LeetCode Minimum Depth of Binary Tree

class Solution {
public:
    int minDepth(TreeNode *root) {
        if (root == NULL) return 0;
        int min_depth = INT_MAX;
        dfs(root, 0, min_depth);
        return min_depth + 1;
    }
    
    void dfs(TreeNode *root, int cur_depth, int& min_depth) {
        if (root == NULL) return;
        if (cur_depth >= min_depth) return;
        // we come here means that cur_depth < min_depth
        if (root->left == NULL && root->right == NULL) { // this is a leaf node
            min_depth = cur_depth;
            return;
        }
        
        dfs(root->left, cur_depth + 1, min_depth);
        dfs(root->right, cur_depth + 1, min_depth);
    }
};

采用dfs遍历,对于深度已经超过当前已有最小值得路径进行裁剪。不过这个深度的概念,自己的理解和题目中的好像有些偏差。当然也可以用bfs,因为是求最小高度平均时间上bfs能够更早的发现最小高度,但是空间上dfs来的更少。下面是bfs的代码

class Solution {
public:
    int minDepth(TreeNode *root) {
        if (root == NULL) return 0;
        return bfs(root) + 1;
    }
    
    int bfs(TreeNode *root) {
        if (root == NULL) return 0;
        int depth = 0; 
        int cur_len = 1;
        queue<TreeNode*> q;
        q.push(root);
        bool hasleft = false;
        bool hasright= false; 
        while (!q.empty()) {
            while(cur_len--) {
                TreeNode* n = q.front();
                q.pop();
                hasleft = n->left != NULL;
                hasright= n->right != NULL;
                if (hasleft) {
                    q.push(n->left);
                }
                if (hasright) {
                    q.push(n->right);
                }
                if (!hasleft && !hasright) return depth;
            }
            depth++;
            cur_len = q.size();
        }
        return depth;
    }
};

 第二轮:

Given a binary tree, find its minimum depth.

The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

dfs的简洁版本:

 1 class Solution {
 2 private:
 3     int mind;
 4 public:
 5     int minDepth(TreeNode *root) {
 6         if (root == NULL) return 0;
 7         if (root->left == NULL) return minDepth(root->right) + 1;
 8         if (root->right == NULL) return minDepth(root->left) + 1;
 9         return min(minDepth(root->left), minDepth(root->right)) + 1;
10     }
11 };

 再练一发bfs:

 1 class Solution {
 2 private:
 3     int mind;
 4 public:
 5     int minDepth(TreeNode *root) {
 6         if (root == NULL) {
 7             return 0;
 8         }
 9         queue<TreeNode*> que;
10         que.push(root);
11         
12         int depth = 1;
13         while (!que.empty()) {
14             int last_len = que.size();
15             for (int i=0; i<last_len; i++) {
16                 TreeNode* n = que.front();
17                 que.pop();
18                 if (n->left == NULL && n->right == NULL) {
19                     // leaf node
20                     return depth;
21                 }
22                 if (n->left != NULL) {
23                     que.push(n->left);
24                 }
25                 
26                 if (n->right != NULL) {
27                     que.push(n->right);
28                 }
29             }
30             depth++;
31         }
32         return depth;
33     }
34 };

 

posted @ 2014-03-18 16:15  卖程序的小歪  阅读(174)  评论(0编辑  收藏  举报