最小深度
来源:互联网 发布:vue.js生命周期面试题 编辑:程序博客网 时间:2024/05/22 03:19
Minimum Depth of Binary Tree
- 问题描述:
leetcode 111
错误解法
- 错误思路:分别求左子树的最小深度和右子树的最小深度;然后取两者的最小值加一。
- 代码如下:
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};int minDepth(TreeNode* root) { if (root==NULL) { //递归出口,处理空树,返回0 return 0; } else{ int left = minDepth(root->left); //分别计算左右子树的最小深度 int right = minDepth(root->right); return min(left, right)+1; //取左右子树的最小深度加一就是所要求解的值 }}
以上算法是错误的: 当图为:
结果为:
错误原因:
如图所示,对于1 的左右子树,左子树的最小深度为1,右子树的最小深度为0;但是结果为2,而不是0+1=1;
正确解法
int min=65535; //定义一个全局变量来记录最小深度struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};void preOrder(TreeNode *root, int level){ //定义一个参数level,为当前层数 if (root!=NULL) { if (root->right==NULL&&root->left==NULL) { //当当前层的节点为叶子节点,且level小于全局min时,更新min if (level<min) { min=level; } } preOrder(root->left, level+1); preOrder(root->right, level+1); }}int minDepth(TreeNode* root) { if (root==NULL) { return 0; } preOrder(root, 1); //由于为了能够,多传入一个纪录层数的参数,定义一个函数preOrder函数来添加level参数。 return min;}
注意点:
- 为了定义一个纪录层数的level,所以minDepth中定义一个函数preOrder来添加level参数
- 递归函数并不是都需要返回值的,比如preOrder, 只是递归遍历树,并没有返回值;(在最大深度中用到的是返回值:http://blog.csdn.net/hellotomhaha/article/details/54955678)
想法:在遍历树的时候,如果用到了全局变量来纪录答案的时候,一般不用返回值的。
递归遍历时,当节点为null时结束;当为叶子节点时需要检验是否需要跟新min
算法分析
0 0
- 最小深度
- 最小深度
- 树------最小数目深度
- 二叉树最小深度
- 树的最小深度
- 二叉树最大深度和最小深度
- 二叉树最大深度和最小深度
- 【算法题】最大深度,最小深度
- 二叉树最大 最小深度
- 二叉树的最小深度
- 二叉树的最小深度
- 二叉树的最小深度
- 二叉树的最小深度
- 二叉树的最小深度
- 二叉树的最小深度
- leetcode 二叉树最小深度
- 二叉树的最小深度
- 二叉树的最小深度
- Java Reflection(十):数组
- 以域管理账户连接到TFS或git时,设置IE允许Cookies
- Linux修改/etc/profile配置错误command is not found自救方法
- Mysql的Root密码忘记,查看或修改的解决方法
- 浅谈MVC,MVP,MVVM区别与联系
- 最小深度
- CCF201604-3 路径解析(解法三)(90分)
- Vim命令#Vim常用基础命令
- RabbitMQ 安装和配置
- 使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)
- in和exists
- java CountDownLatch 模拟用户并发请求
- Java Reflection(十一):动态代理
- JS 中call 和apply 详解