使用堆栈和有序遍历检查Tree是否为BST

问题描述

这是我的代码,但未产生任何输出

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替换为左树上的上限和右树上的下限。