【问题标题】:Check whether a tree is a binary search tree using inorder使用中序检查树是否为二叉搜索树
【发布时间】:2018-06-27 15:11:05
【问题描述】:
int* inorder(node* root)
{
    //Dynamically Created array as we are required to pass array into main function
    int* arr=new int[100];
    int i=0;
    if(root==NULL)
    return 0;
    inorder(root->left);
    arr[i]=root->data;
    i++;
    inorder(root->right);
    return arr;
}

我们需要使用中序遍历检查树是否为Bst。如果数组中存在的数据已排序,则为Bst。在main()中传递数组后,我们将检查数组是否已排序或不是,但 当我检查数组的内容时,它是一个垃圾值 并且对于输入树来说,树总是不是 Bst

int main()
{
    node* root= newNode(6);
    root->left= newNode(4);
    root->right= newNode(8);
    root->left->left= newNode(3);
    root->left->right= newNode(5);
    root->right->left= newNode(7);
    root->right->right= newNode(9);
    int* ptr=inorder(root);
    if(is_sorted(ptr,ptr+7))
    cout<<"Tree is Binary search tree: "<<endl;
    else
    cout<<"Tree is not a binary search tree: "<<endl;
}

【问题讨论】:

  • 你有很多内存泄漏的机会,特别是因为你没有对递归调用返回的指针做任何事情。
  • 至于您的问题,您分配的数组是否应该由对inorder 函数的all 调用使用和共享?然后除了它以任何方式共享之外,你甚至不初始化它。实际上,当您可以访问 std::vector 时,请停止使用 new[]
  • vector inorder(node* root) { vector v;如果(根==NULL)返回; //如果根为NULL,返回什么 inorder(root->left); v.push_back(root->data) inorder(root->right);返回 v; }
  • 您的数组包含垃圾也就不足为奇了。什么时候设置数组中除arr[0] 之外的任何元素的值(更准确地说,arr[i]i 等于0)?

标签: c++ arrays sorting binary-search-tree


【解决方案1】:

这里不需要使用向量。确定一棵树是否是二叉搜索树不需要任何额外的内存,除了用于递归调用的堆栈。

如果你定义一个单独的中序树遍历算法,使得实现几乎是微不足道的:

#include <utility>
#include <functional>

template<class T>
struct Node {
    T value;
    Node *left, *right;
};

template<class T, class F>
bool traverse_inorder(Node<T> const* tree, F&& f) {
    return !tree || (
           traverse_inorder(tree->left, std::forward<F>(f))
        && f(tree->value)
        && traverse_inorder(tree->right, std::forward<F>(f))
        );
}

template<class T, class Pred>
bool is_bst(Node<T> const* tree, Pred&& pred) {
    T const* p = 0;
    return traverse_inorder(tree, [&p, &pred](T const& next) {
        T const* prev = p;
        p = &next;
        return !prev || !pred(next, *prev);
    });
}

template<class T>
bool is_bst(Node<T> const* tree) {
    return is_bst(tree, std::less<T>{});
}

int main() {
    // bst tree:
    //       33
    //   20      35
    // 10  30
    Node<int> n1{10}, n3{30}, n2{20, &n1, &n3}, n5{35}, n4{33, &n2, &n5};
    auto tree = &n4;

    std::cout << is_bst(tree) << '\n'; // Outputs 1.

    // Break bst property.
    n4.value = 25;
    std::cout << is_bst(tree) << '\n'; // Outputs 0.
}

要使用中序遍历将树转换为向量,您可以使用以下函数:

template<class T>
std::vector<T> inorder_to_vector(Node<T> const* tree) {
    std::vector<T> v;
    traverse_inorder(tree, [&v](T const& t) {
        v.push_back(t);
        return true;
    });
    return v;
}

【讨论】:

  • 使用inorder我想形成一个向量,这个向量我将传入main()来检查它是否被排序如果它被排序那么它是Bst。我想用向量来做
  • @Gaurav1527 为你添加了转换功能。
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 2018-05-16
  • 2012-06-05
  • 2017-09-28
  • 1970-01-01
相关资源
最近更新 更多