返回信息流LeetCode第110道题,判断是否为平衡二叉树,原题如下:
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
在网上搜到了一种解法让我非常困惑,如下:
class Solution {
public:
bool isBalanced(TreeNode *root) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int depth = 0;
return isbalance(root, depth);
}
bool isbalance(TreeNode *root, int &depth)
{
if(root == NULL)
{
depth = 0;
return true;
}
int ld,rd;
if( isbalance(root->left,ld) && isbalance(root->right,rd))
{
if( abs(ld - rd) > 1)
{
return false;
}
depth = ld > rd ? ld + 1 : rd + 1;
return true;
}
}
};
判断函数中的return语句写在了if语句之中,那么如果一个子树不满足平衡二叉树的条件的话,它向上层递归返回false,这样一来上层递归的if语句就不会被执行,它也不会再向更上一层的递归返回true或false值。
不过这种解法是能AC的,难道LeetCode的编译器将bool函数返回值默认定义了false吗?求助。。。
这是一条镜像帖。来源:北邮人论坛 / cpp / #86169同步于 2015/3/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
c++新特性中bool函数有默认返回值吗?
yunwu
2015/3/27镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
C语言没有所谓的“默认返回值”。凡是返回值类型不是void的函数,只要有可能的控制流执行到函数结尾却不遇到return语句,就是undefined behaviour。C语言标准对此不做任何规定,也就是语言实现(编译器、运行库、处理器等)做什么都行,从什么都不发生到机器冒烟都是C语言标准允许的结果。所以,结论:你贴的代码是错误的,因为最后一个if(你的红字)的条件如果是假,就会到达函数末尾而不执行任何return语句。
如果这个程序可以AC,那么只是巧合。那是OJ的问题。
多谢暖神解惑[ema23]
【 在 nuanyangyang 的大作中提到: 】
: C语言没有所谓的“默认返回值”。凡是返回值类型不是void的函数,只要有可能的控制流执行到函数结尾却不遇到return语句,就是undefined behaviour。C语言标准对此不做任何规定,也就是语言实现(编译器、运行库、处理器等)做什么都行,从什么都不发生到机器冒烟都是C语言标准允许的结果。所以,结论:你贴的代码是错误的,因为最后一个if(你的红字)的条件如果是假,就会到达函数末尾而不执行任何return语句。
: 如果这个程序可以AC,那么只是巧合。那是OJ的问题。
又见机器冒烟。
【 在 nuanyangyang 的大作中提到: 】
: C语言没有所谓的“默认返回值”。凡是返回值类型不是void的函数,只要有可能的控制流执行到函数结尾却不遇到return语句,就是undefined behaviour。C语言标准对此不做任何规定,也就是语言实现(编译器、运行库、处理器等)做什么都行,从什么都不发生到机器冒烟都是C语言标准允许的结果。所以,结论:你贴的代码是错误的,因为最后一个if(你的红字)的条件如果是假,就会到达函数末尾而不执行任何return语句。
: 如果这个程序可以AC,那么只是巧合。那是OJ的问题。
【 在 moonfighting 的大作中提到: 】
: LeetCode的函数返回机制确实让人疑惑,我有几个题忘了返回最后的结果了还是AC了
哪里有什么“LeetCode的函数返回机制”,只能说:“LeetCode选用的编译器碰巧能把某些有undefined behaviour的程序编译成能AC的程序。”要练习编程就应该学C/C++,不要去猜测某个网站的编译器的行为。
啊,我就是那个意思啦,只是省略着说了。刷leetcode是为了找工作面试,当然不会去在意这些东西了。
【 在 nuanyangyang 的大作中提到: 】
:
: 哪里有什么“LeetCode的函数返回机制”,只能说:“LeetCode选用的编译器碰巧能把某些有undefined behaviour的程序编译成能AC的程序。”要练习编程就应该学C/C++,不要去猜测某个网站的编译器的行为。
【 在 moonfighting 的大作中提到: 】
: 啊,我就是那个意思啦,只是省略着说了。刷leetcode是为了找工作面试,当然不会去在意这些东西了。
为了以后工作中可以不写让机器冒烟的代码(没准哪天我会成为你的客户呢[ema21]),还是留意一下这些细节吧。
谨遵暖神教诲
【 在 nuanyangyang 的大作中提到: 】
:
: 为了以后工作中可以不写让机器冒烟的代码(没准哪天我会成为你的客户呢),还是留意一下这些细节吧。