La secuencia binaria de probar la oferta de seguridad

título Descripción

Implementar dos funciones se utilizan para serializar y deserializar binario

Se refiere a una secuencia de binario: el árbol binario se guarda en un formato de cadena de acuerdo con el resultado de una forma de desplazamiento de tal manera que la memoria se puede configurar binario persistió. Serialización se puede basar en el primer orden, en secuencia, después, la secuencia de recorrido de árbol binario es modificado, la secuencia del resultado es una cadena que representa los nodos en blanco (#) por algunas secuencias de símbolo para! nodo final representa un valor (valor!).

deserializados medios de árboles binarios: La cadena serializada str algunos resultados obtenidos orden de recorrido de reconstruir un árbol binario.

pensamiento

Esta pregunta es simplemente muy enferma desesperada, probablemente porque me vi obligado a plato. .
Serialización: de acuerdo a atravesar el nivel obtenido, ni que decir
deserializar idea:
cadena Supongamos 12345 # 6 # 7 # # # # # # !!!!!!!!!!!!!! !
que corresponde a la estructura:
. 1
2. 3
. 4. 5. 6 NULL
. NULL NULL NULL NULL NULL 7
nuestro algoritmo serialización por defecto no es subárbol NULL, y por lo tanto la tercera capa no es NULL subárbol, sólo la cuarta capa 4, subárbol 6.

En primer lugar, la cadena de caracteres en un nodo de cola
seguido binario recombinante

En la siguiente manera:
Primero:
q_Tree_2 1.
Q_Tree_1 2. 5. 4. 3. 6 NULL NULL NULL NULL NULL NULL 7.

Este paso 1pop uno a uno a salir 2 y 3, y dispuesto para los subárboles izquierdo y derecho 1, 2 y 3 y la presión en el q_Tree_2

Segundo:
q_Tree_2 2 3
q_Tree_1 4 5 6 NULL NULL NULL NULL NULL NULL 7

2 y 3pop a cabo de forma secuencial, la 4,5NULL, 6pop a cabo, hay que señalar que el subárbol izquierdo es NULL 3, no requiere un nodo secundario asignado a él, que no es necesario el ajuste a presión q_Tree_2 NULL

Tercero:
q_Tree_2 4 5 6
q_Tree_1 NULL NULL NULL NULL NULL 7

Cuatro:
q_Tree_2 7
q_Tree_1

¡Terminar!

código

class Solution {
public:
    queue<TreeNode*> q_Tree_1;
    queue<TreeNode*> q_Tree_2;
    /* 我这里用了层次遍历,这个就不赘述了,大家应该都知道*/
    char* Serialize(TreeNode *root) {   
        char* res;
        string serial;
        if (root == NULL)
        {
            res = new char[3]();
            res[0] = '#';
            res[1] = '!';
            return res;
        }
        queue<TreeNode*> q_Tree;
        q_Tree.push(root);
        while (q_Tree.size() > 0)
        {
            TreeNode* current = q_Tree.front();
            q_Tree.pop();
            if (current == NULL)
            {
                serial = serial + '#' + '!';
            }
            else
            {
                serial = serial + to_string(current->val) + '!';
                if (current->left == NULL && current->right == NULL)
                {
                    continue;
                }
                else
                {
                    q_Tree.push(current->left);
                    q_Tree.push(current->right);
                }

            }
        }
        int a = serial.size();
        char* res_2= new char[a + 1]();
        memcpy(res_2, serial.c_str(), a);
        return res_2;
    }
    /*  这个是逆序列函数,将一段字符串换成一堆结点保存到q_Tree_1中 */
    TreeNode* Deserialize(char *str) {
        string s = str;
        if (s.size() == 0 || s[0] == '#')
        {
            return NULL;
        }
        int end = 0;
        while (end < s.size())
        {
            TreeNode* node = sring_node(s, end, s.find("!", end + 1));
            q_Tree_1.push(node);
            if (end == s.size())
                break;
            else
                end = s.find("!", end + 1) + 1;
        }
        TreeNode* root;
        root = Deserialize_sub();
        return root;
    }
    /* 这个函数是将一段字符转换为数字,start标志上一个!的下一位,end表示这次找到的!,二者就将这个结点数字对应的字符取出*/
    TreeNode* sring_node(string s,int start, int end)
    {
        int number = 0;
        for (int i = start; i < end; i++)
        {
            if (s[i] == '#')
            {
                return NULL;
            }
            else
            {
                number = number + (s[i] - '0')*pow(10, end - i - 1);
            }
        }
        TreeNode* node = new TreeNode(number);
        return node;
    }
        /* 这个函数是将结点重构成树,利用两个队列,队列1保存剩余结点,队列2保存下次分配子结点的那些结点。特别需要注意的!调了2个小时才明白的!每次队列1pop之后,需要判断pop出来的是不是NULL,NULL的就不push到队列2中,因为NULL没有子树*/
    TreeNode* Deserialize_sub()
    {
        if (q_Tree_1.size() == 0)
		    return NULL;
        int count = 0;
        TreeNode* root;
        root = q_Tree_1.front();
        q_Tree_1.pop();
        q_Tree_2.push(root);
        while (q_Tree_1.size()>0)
        {
            int size = q_Tree_2.size();
            for (int i = 0; i < size; i++)
            {
                TreeNode* node = q_Tree_2.front();
                q_Tree_2.pop();
                TreeNode* node_left = q_Tree_1.front();
                q_Tree_1.pop();
                node->left = node_left;
                TreeNode* node_right = q_Tree_1.front();
                q_Tree_1.pop();
                node->right = node_right;
                if(node_left) q_Tree_2.push(node_left);
                if(node_right) q_Tree_2.push(node_right);
            }
            count++;
        }
            return root;
        }
};
Publicado 85 artículos originales · ganado elogios 0 · Vistas 395

Supongo que te gusta

Origin blog.csdn.net/weixin_38312163/article/details/104853889
Recomendado
Clasificación