问题描述
求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。
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.
解法
(1)DFS+递归
递归,若为空树返回0;
若左子树为空,则返回右子树的最小深度+1;(加1是因为要加上根这一层,下同)
若右子树为空,则返回左子树的最小深度+1;
若左右子树均不为空,则取左、右子树最小深度的较小值,+1;
using namespace std;
class Solution {
public:
int run(TreeNode *root) {
if(root==NULL)return 0;
return find(root);
}
int find(TreeNode *node){
if(node->left==NULL && node->right==NULL)return 1;
if(node->left ==NULL){
return find(node->right)+1;
}
if(node->right== NULL){
return find(node->left)+1;
}
return min(find(node->left),find(node->right))+1;
}
};
注意递归的返回条件:左右都无子树时,返回1;
(2)DFS+栈
这里就是非递归实现DFS
(3)BFS+队列
全局变量保存深度值。
访问节点,左右节点存队列。某层遍历完后全局变量+1,出队列,当某节点无子树,return 深度值。
#include <queue>
class Solution {
public:
typedef TreeNode* tree;
int run(TreeNode *root) {
if(root == NULL)return 0;
int depth = 1;
queue <tree> q;
q.push(root);
while(!q.empty()){
int size = q.size();
for(int i=0;i<size;i++){
tree temp = q.front();
q.pop();
if(temp->left==NULL && temp->right == NULL){
return depth;
}
if(temp->left != NULL){
q.push(temp->left);
}
if(temp->right != NULL){
q.push(temp->right);
}
}
depth++;
}
return depth;
}
};
注意代码的健壮性,当初始根结点为空时返回0。