问题描述
stack < int > st;
bool func(Node * root) {
if (root != NULL) {
func(root -> left);
st.push(root -> data);
func(root -> right);
}
while (!st.empty()) {
int upar = st.top();
st.pop();
if (upar > st.top()) {
continue;
} else {
return 0;
}
}
return 1;
}
请告诉我我想念的是什么。我跟踪了正确的代码,但未显示相关结果。
解决方法
我从您的代码中看到的是,您的函数func()
是递归调用的,但从未检查其返回值。如果这意味着将内容压入堆栈以创建有序遍历,那应该没问题,但是您还包括了while循环,以检查数据是否按升序排列。这是问题。
我能想到的最简单的解决方法是将其分为两个部分:
stack < int > st;
void func(Node * root) {
if (root != NULL) {
func(root -> left);
st.push(root -> data);
func(root -> right);
}
}
bool check(Node* root) {
func(root);
while (!st.empty()) {
int upar = st.top();
st.pop();
if (upar > st.top()) {
continue;
} else {
return 0;
}
}
return 1;
}
但是您必须检查是否要假设BST中没有重复的条目,因为您使用的是upar > st.top()
而不是>=
。
如果您坚持将两者合并为一个函数,则可以考虑更改func()
以传递除Node*
之外的值的上限或下限,以便您可以相应地检查左侧和正确的子树。在这种情况下,您可以一起跳过堆栈的使用。但是从根节点开始,从负无穷大到正无穷大。进行递归时,将root->data
替换为左树上的上限和右树上的下限。