Estructura de datos: implementación del árbol de búsqueda binaria

二叉查找树

Un árbol binario es una estructura similar a un árbol con como máximo dos subárboles como nodos, que pueden denominarse subárbol izquierdo y subárbol derecho. Sin embargo, para los árboles binarios ordinarios, no hay suficiente información para indicarnos qué almacenan el subárbol izquierdo y el subárbol derecho, y no tenemos forma de realizar una búsqueda de información eficiente. Para mejorar la eficiencia de la búsqueda, actualizaremos el árbol binario a un árbol de búsqueda binario (árbol de búsqueda binaria).

Un árbol de búsqueda binario es un árbol binario que se ajusta a la siguiente definición:

1. Todos los valores clave de nodo en el subárbol izquierdo del nodo son más pequeños que el nodo.

2. Todos los valores clave de nodo en el subárbol derecho del nodo son mayores que el nodo.

3. No hay valores clave duplicados

De esta manera, cuando buscamos un nodo según el valor clave, ¿podemos buscar en una dirección? Comenzando desde el nodo raíz, si el valor de la clave no es igual al valor de la clave de destino y el valor de la clave de destino es menor que el nodo actual, iremos al subárbol izquierdo para continuar la búsqueda; de lo contrario, iremos al subárbol derecho. De esta manera puedes estar seguro de avanzar un nivel cada vez. De esta forma, la eficiencia de las consultas mejorará enormemente.

节点结构定义
class BSTNode{
public:
    BSTNode(int d=0,BSTNode* l=0,BSTNode* r=0):data(d),left(l),right(r){};
    int data;
    BSTNode* left;
    BSTNode* right;
 
};

La implementación del código en este artículo es solo para ilustrar los algoritmos relevantes y no se puede aplicar directamente al diseño industrial, por lo que no usaré plantillas aquí. Los datos del nodo son todos datos enteros.

Se requiere un nodo de datos, un puntero de subárbol izquierdo a la izquierda y un puntero de subárbol derecho a la derecha.

二叉查找树结构定义
class BST{
public:
    BST(BSTNode* r=0):root(r){
        size = 0;
    }
    ~BST();
    enum dfstype{PRE=0,IN=1,POST=2};
    enum deletetype{MERGE=0,COPY=1};
    //插入
    void insert(int data);
    //查找
    bool find(int data) const;
    //层次遍历
    void bfs() const;
    //深搜遍历
    void dfs(BST::dfstype) const;
    //递归写法
    void predfs(BSTNode*) const;
    void indfs(BSTNode*) const;
    void postdfs(BSTNode*) const;
    //回溯写法
    void predfsNormal() const;
    void indfsNormal() const;
    void postdfsNormal() const;
    //计数写法
    void predfsCount() const;
    void indfsCount() const;
    void postdfsCount() const;
    void clearTime();
    //删除相关
    void deleteELement(int data,enum deletetype type);
    void mergeDelete(BSTNode*&);
    void copyDelete(BSTNode*&);
    //平衡树
    /*
    *中序遍历得到有序数组,然后根据数组重新构建树,效率较低
    */
    void balance();
    void balance(int data[],int first,int last);
    //DSW旋转算法
    void rightRotate(BSTNode* z,BSTNode* f,BSTNode* n);
    void leftRotate(BSTNode* z,BSTNode* f,BSTNode* n);
    void createList();
    void createPerfectTree();
    //AVL树
 
    //其它
    int getSize() const;
    void clear();//清空节点
     
private:
    BSTNode* root;
    int size;
};
插入算法
void BST::insert(int data){
    BSTNode* newnode = new BSTNode(data);
    BSTNode* temp = root;
    BSTNode* pre = 0;
    while(temp!=0){
        pre = temp;
        if(temp->data>data){
            temp = temp->left;
        }else if(temp->data<data){
            temp = temp->right;
        }else{
            return;
        }
    }
    if(pre==0)
        root = newnode;
    else{
        if(pre->data>data){
            pre->left = newnode; 
        }else{
            pre->right = newnode;
        }
    }
    size++;
}
查找元素算法
bool BST::find(int data) const{
    BSTNode* temp = root;
    while(temp!=0)
    {
        if(temp->data==data)
            return true;
        else if(temp->data>data)
            temp = temp->left;
        else
            temp = temp->right;
    }
    return false;
}
树的遍历
树的遍历
方法有两种:深度优先遍历(Depth First Search,DFS),广度优先遍历(Breadth First Search,BFS)
广度优先遍历利用队列一层一层访问即可。
深度优先遍历分未3种:先序、中序、后序遍历。
值得一提的是,对于符合定义的二叉查找树来说,中序遍历的结果恰好是有序的(有趣不有趣?),所以中序遍历应用最为广泛的。

Supongo que te gusta

Origin blog.csdn.net/qq_32301683/article/details/101381758
Recomendado
Clasificación