Fortuna base izquierda ley secuencia del título class4- de 4 árbol binario y deserialización

1. Título: serialización binaria y deserialización

Aquí Insertar imagen Descripción

① La serialización se refiere guardar un árbol de registro que se guarda con la secuencia de serialización preorden recorrido manera. Orden de la primera secuencia es 1,2,4,5,3,6,7; entre un "_" separados, a los cuales cuatro nodo 4,5,6,7 hoja al nodo alrededor de ella se almacena como " #", el resultado final de la primera secuencia es una secuencia 1_2_4_ # # 5 # # 3_6 # # 7 # #_.
② deserialización es restaurar la serialización de una estructura de árbol en la memoria.

2. Análisis

Secuencia de (1) una primera secuencia

Esencia de la primera secuencia motivo sigue siendo preorden de recorrido, el conector intermedio pero agregó "_" y subárboles de la izquierda y la derecha vacía "#". Consideremos en primer lugar el modo de recorrido de recursión, y una cadena se almacena con la secuencia completa de los resultados. valores de tipo int Aquí poner almacena en nodos de cadena: árbol de nodos es de tipo int, no directamente en la cadena en la cadena, el proceso sigue
el archivo de encabezado: #include
cadena S = la to_string (I); // número entero I se convierte a una representación de cadena. Después de 22 tipo eg.int convierte en tipo de cadena "22" literal, pero en realidad almacenado es dos char-2

string serialByPre(Tree *head)
{
	if(head == NULL)
		return "#_";//为空时返回#,_是连接符
	string res = to_string(head->val) + '_';//字符串拼接
	res += serialByPre(head->left);
	res += serialByPre(head->right);
	return res;
}

(2) primero deserialización orden

Deserialización dos etapas, puesto que los elementos conectores separados para sólo para ayudar a la primera etapa es eliminar el conector, almacenado en un recipiente; segundo paso es re-configuración del árbol de expansión.

① quitar el separador y se almacenan en una cola

delimitadores función Quitar GetLine. istream& getline (istream&& is, string& str, char delim);Función se lee en la corriente de la línea es, delim delimitador de parada se encuentra cuando se encuentra delimitador delim, se extrae y se desecha y no se almacena en str, la siguiente entrada de la operación después de que comienza; primero parámetro es un objeto de secuencia, la cadena usando el flujo de la operación, la secuencia de la cadena generada a la corriente de cadena stringstream ss(s);. A continuación, utilice un tiempo bucle continúa para leer getline()sin "_" de contenido puede ser colocado en la cola. Debido a que la cola de almacenamiento FIFO está garantizada la misma secuencia, el elemento necesario para utilizar directa fácilmente pop cola en la cola.

Tree* reconByPreString(string s)
{
	if(s == "#_")//空树直接返回NULL
		return NULL;

	stringstream ss(s);//string流#include<sstream>
	string item;
	queue<string> q;
	while (getline(ss, item, '_')) 
		q.push(item);
		
	return reconPreOrder(q);
}

② re abarca estructura de árbol

Re configuración del árbol se utiliza para la reconstrucción del orden previo de recorrido de nodos del árbol, la idea es específica al primer elemento de la cola del pop como el nodo principal, entonces, de acuerdo a la moda orden previo sobre el establecimiento del primer nodo de la izquierda y la derecha recursividad. Aquí el valor literal "11" se convierte en una función int 11 uso Stoi (), que se utiliza como sigue.

//stoi的形参是const string*,而atoi的形参是const char*。c_str()的作用是将const string*转化为const char*。
	/*string s1("1234567");
	char* s2 = "1234567";
	int a = stoi(s1);
	int b = atoi(s2);
	int c = atoi(s1.c_str());*/

Parte del código

Tree* reconPreOrder(queue<string>& q)//一定要用引用,因为要弹出最先的元素
{
	string val = q.front();//
	q.pop();
	if(val == "#")
		return NULL;
	Tree *head1 = new Tree(stoi(val));//“11”转换为int型11
	
	head1->left = reconPreOrder(q);
	head1->right = reconPreOrder(q);
	return head1;
}

3. El código completo

#include <iostream>
#include<string>
#include<queue>
#include<sstream>
using namespace std;

//树的数据结构
class Tree
{
public:
	int val;
	Tree *right;
	Tree *left;
	Tree(int x)
	{
		this->val = x;
		this->left = NULL;
		this->right = NULL;
	}
	Tree(){;}
};

//反序列化生成节点
Tree* reconPreOrder(queue<string>& q)//一定要用引用,因为要弹出最先的元素
{
	string val = q.front();//
	q.pop();
	if(val == "#")
		return NULL;
	Tree *head1 = new Tree(stoi(val));//“11”转换为int型11
	
	head1->left = reconPreOrder(q);
	head1->right = reconPreOrder(q);
	return head1;
}

//去掉间隔符
Tree* reconByPreString(string s)
{
	if(s == "#_")
		return NULL;

	stringstream ss(s);
	string item;
	queue<string> q;
	while (getline(ss, item, '_')) 
		q.push(item);

	return reconPreOrder(q);
}


//先序序列化
string serialByPre(Tree *head)
{
	if(head == NULL)
		return "#_";//为空时返回#,_是连接符
	string res = to_string(head->val) + '_';//字符串拼接
	res += serialByPre(head->left);
	res += serialByPre(head->right);
	return res;
}

int main()
{
	Tree *head = new Tree(11);
	head->left = new Tree(22);
	head->left->left = new Tree(44);
	head->left->right = new Tree(55);
	head->right = new Tree(33);
	head->right->left = new Tree(66);
	head->right->right= new Tree(77);
	string s1 = serialByPre(head);

	Tree *head1 = reconByPreString(s1);
	system("pause");
	return 0;
}
Publicado 51 artículos originales · ganado elogios 1 · vistas 1374

Supongo que te gusta

Origin blog.csdn.net/shi_xiao_xuan/article/details/103903992
Recomendado
Clasificación