问题描述:求出树的最小深度(在这个路径上,结点数最少)
解题思想:链接:https://www.nowcoder.com/questionTerminal/e08819cfdeb34985a8de9c4e6562e724
递归,若为空树返回0;
若左子树为空,则返回右子树的最小深度+1;(加1是因为要加上根这一层,下同)
若右子树为空,则返回左子树的最小深度+1;
若左右子树均不为空,则取左、右子树最小深度的较小值,+1;
代码实现:
int run(TreeNode *root) {
if(root == nullptr)
return 0;
if(root->left == nullptr)
return run(root->right)+1;
if(root->right == nullptr)
return run(root->left)+1;
int left_num = run(root->left);
int right_num =run(root->right);
return left_num < right_num?(left_num+1):(right_num+1);
}
方法二:利用层序遍历,找到第一个叶子结点
int run(TreeNode *root) {
if (root == nullptr)
return 0;
queue<TreeNode*>qu_tree;
int level = 1;
qu_tree.push(root);
TreeNode * now = root;
TreeNode* last = root;
int level = 1;
while (!qu_tree.empty()){
now = qu_tree.front();
qu_tree.pop();
int size = qu_tree.size();
if (now->left != nullptr)
qu_tree.push(now->left);
if (now->right != nullptr)
qu_tree.push(now->right);
if (qu_tree.size() == size)//说明now左右子树都为空,退出循环,找到最短
break;
if (last == now){//进行层数统计条件
level++;
if (!qu_tree.empty())//标记每层的最后一个结点
last = qu_tree.back();
}
}
}