Redian新闻
>
遇到了一个很奇怪的C++问题
avatar
遇到了一个很奇怪的C++问题# JobHunting - 待字闺中
r*h
1
直接使用st.push(cur->left);将左子树节点入栈
和先赋值cur = cur->left; 再st.push(cur);
结果竟然是不一样的
找了半天找不到bug,结果简单替换一下就正常了- -!
真心请教一下,这是为什么呀。。。
avatar
p*e
2
全部code贴出来看看
avatar
r*h
3
就是循环后序遍历呀
if(prev==NULL || prev->left==cur || prev->right==cur){
if(cur->left != NULL){
st.push(cur->left); <==============
}
else if(cur->right != NULL){
st.push(cur->right); <==============
}
}
大概像这样
箭头指着的地方换成一开始的写法就不行了

【在 p****e 的大作中提到】
: 全部code贴出来看看
avatar
r*h
4
class Solution {
public:
int maxDepth(TreeNode *root) {
if(root == NULL) return 0;
stack st;
st.push(root);
TreeNode *prev=NULL, *cur;
int maxHeight = 0;

while(st.size()>0){
cur = st.top();
if(prev==NULL || prev->left==cur || prev->right==cur){
if(cur->left != NULL){
st.push(cur->left);
}
else if(cur->right != NULL){
st.push(cur->right);
}
}
else if(cur->left == prev){
if(cur->right != NULL){
st.push(cur->right);
}
}
else{
st.pop();
}
if(st.size() > maxHeight){
maxHeight = st.size();
}
prev = cur;
}
return maxHeight;
}
};
完整代码是这样的
avatar
p*e
5
当然不对了,后面你有
prev = cur;
如果你修改了cur的值,结果就不一样了。。

【在 r**h 的大作中提到】
: class Solution {
: public:
: int maxDepth(TreeNode *root) {
: if(root == NULL) return 0;
: stack st;
: st.push(root);
: TreeNode *prev=NULL, *cur;
: int maxHeight = 0;
:
: while(st.size()>0){

avatar
r*h
6
但是我就是直接替换的呀

if(cur->left != NULL){
cur = cur->left;
st.push(cur);
}
换成
if(cur->left != NULL){
st.push(cur->left);
}
应该不存在cur的值被改变的问题吧?

【在 p****e 的大作中提到】
: 当然不对了,后面你有
: prev = cur;
: 如果你修改了cur的值,结果就不一样了。。

avatar
L*e
7
替换前后cur的值不一样呀,一个是cur另一个是cur->left

【在 r**h 的大作中提到】
: 但是我就是直接替换的呀
: 将
: if(cur->left != NULL){
: cur = cur->left;
: st.push(cur);
: }
: 换成
: if(cur->left != NULL){
: st.push(cur->left);
: }

avatar
r*h
8
哦哦。。。突然理解了!!
是因为cur值改变导致后面prev得不到正确的值了
哎我真粗心

【在 L********e 的大作中提到】
: 替换前后cur的值不一样呀,一个是cur另一个是cur->left
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。