###### tags: `Leetcode` `easy` `tree` `python` `c++`
# 111. Minimum Depth of Binary Tree
## [題目來源: ] https://leetcode.com/problems/minimum-depth-of-binary-tree/
## 題目:
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.
**Note: A leaf is a node with no children
Input: root = [2,null,3,null,4,null,5,null,6]
Output: 5
## 解題思路:
* 遞迴:
* 若沒左子->遞迴右子+1
* 若沒右子->遞迴左子+1
* min(遞迴左子,遞迴右子)+1
* bfs:
* queue存(root,1) 當前root,深度
* 終止條件:直到pop到某root沒有左右子
## Python:
``` python=
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def insertLeft(self,node):
if self.left==None:
self.left=TreeNode(node)
else:
self.left.insertLeft(node)
def insertRight(self,node):
if self.right==None:
self.right=TreeNode(node)
else:
self.right.insertRight(node)
def printTree(self):
root=self
stack=[root]
res=[]
while stack:
root=stack.pop(0)
res.append(root.val)
if root.left:
stack.append(root.left)
if root.right:
stack.append(root.right)
print(res)
class Solution(object):
def minDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
#bfs
if not root:
return 0
que=[(root,1)]
while que:
cur,height=que.pop(0)
if not cur.left and not cur.right:
return height
if cur.left:
que.append((cur.left,height+1))
if cur.right:
que.append((cur.right,height+1))
return -1
'''
dfs
if not root:
return 0
if not root.left:
return self.minDepth(root.right)+1
if not root.right:
return self.minDepth(root.left)+1
return min(self.minDepth(root.right),self.minDepth(root.left))+1
'''
root=TreeNode(3)
root.insertLeft(9)
root.insertRight(20)
root.right.insertLeft(15)
root.right.insertRight(7)
root.printTree()
result=Solution()
ans=result.minDepth(root)
print(ans)
```
## C++
``` cpp=
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(): val(0), left(nullptr), right(nullptr) {}
TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode* left, TreeNode* right): val(x), left(left), right(right) {}
};
void InsertLeft(TreeNode* root, int data){
TreeNode *tmp=root;
if (tmp->left != nullptr)
InsertLeft(root->left, data);
else{
TreeNode *new_left= new TreeNode(data);
tmp->left=new_left;
}
}
void InsertRight(TreeNode*root, int data){
TreeNode *tmp=root;
if (tmp->right != nullptr)
InsertRight(root->right, data);
else{
TreeNode *new_right= new TreeNode(data);
tmp->right=new_right;
}
}
void PrintTree(TreeNode* root){
TreeNode *tmp=root;
vector<int> res;
queue<TreeNode*> que;
que.push(root);
while (!que.empty()){
TreeNode *curRoot=que.front(); que.pop();
res.push_back(curRoot->val);
if (curRoot->left)
que.push(curRoot->left);
if (curRoot->right)
que.push(curRoot->right);
}
for (int i=0; i<res.size(); i++){
cout<<res[i]<<" ";
}
cout<<endl;
}
class Solution{
public:
bool isBalanced(TreeNode* root){
if(root==nullptr)
return true;
bool balanced=true;
height(root, &balanced);
return balanced;
}
bool height(TreeNode* root, bool* balanced){
if (!root)
return 0;
int hL=height(root->left, balanced);
int hR=height(root->right,balanced);
if (abs(hL-hR)>1){
//call by reference get real value
*balanced=false;
return -1;
}
return max(hL,hR)+1;
}
};
int main(){
TreeNode *root= new TreeNode(3);
InsertLeft(root,9);
InsertRight(root,20);
InsertLeft(root->right,15);
InsertRight(root->right,7);
PrintTree(root);
Solution res;
bool ans=res.isBalanced(root);
cout<<ans<<endl;
return 0;
}
```