遍历二叉搜索树

Traversing a binary search tree

我实现了一个基本的二叉搜索树。这是我的节点

 #ifndef NODE_H
    #define NODE_H

    template<typename T> class node{

        template<typename E> friend class bst;

        public:
            node():data(0), left(NULL), right(NULL){}
            node(T data):data(data),left(NULL), right(NULL){}   

        private:
            T data;
            node<T>* left;
            node<T>* right;
    };

#endif

这是我的生日礼物。

#ifndef BST_H
#define BST_H

template<typename T> class bst{
    public:
        bst():root(NULL), nodes(0){}
        bst(node<T>* root):root(root), nodes(0){}

        void insert(node<T>* root, const T& data){

            if(root == NULL){
                node<T>* root = new node<T>();
                root->data = data;
                nodes++;
                return;
            }else if(data <= root->data) {
                insert(root->left, data);

            }else if(data >= root->data){
                insert(root->right, data);

            }
        }

        void preorder(node<T>* root){
            if(root == NULL) return;
            std::cout<< root->data<<'\n';

            preorder(root->left);
            preorder(root->right);
        }
    private:
        node<T>* root;
        int nodes;
};
#endif

这是调用函数

int main(){

    node<int>* root = new node<int>(17);
    bst<int>* t = new bst<int>(root);


    t->insert(root,21);
    t->insert(root,12);
    t->insert(root, 9);

    t->preorder(root);

    delete t;
}

输出就是17,也就是根。我觉得不知何故我的插入方法没有正常工作,因为预购是一个非常标准的实现。有人可以帮我看看这里出了什么问题吗?

insert里面不创建局部变量,只用one passe。所以而不是

node<T>* root = new node<T>();

只做

root = new node<T>();

并通过引用传递 root。我会用 typedef

typedef node<T>* nodePtr;
void insert(nodePtr &root, const T& data){

但你也可以不用

您必须通过引用传递根,并且不要创建隐藏它的局部变量:

// ...
void insert(node<T>*& root, const T& data){ // passed by reference

            if(root == NULL){
                root = new node<T>();       // reference overwritten
//...

这给了我

17
12
9
21

作为输出,我猜是预购的预期。

我看到两个问题。

首先是您在 insert() 方法中将 root 声明为局部变量。此名称与数据成员根重叠。

其二,按照你的设计,根没有更新

此代码应该有效:

void insert(node<T>*& root, // <-- root as reference for updating
            const T& data){

        if(root == NULL){
            root = new node<T>(); // <-- here you update root
            root->data = data;
            nodes++;
            return;
        }else if(data <= root->data) {
            insert(root->left, data);

        }else if(data >= root->data){
            insert(root->right, data);

        }
    }

当然,你可以重构,从而得到更简洁优雅的实现。但这应该会产生您期望的结果