directorio
La búsqueda binaria (ordenados) define árbol
La búsqueda binaria nodo de inserción de árbol
Búsqueda binaria árbol para encontrar el valor
Binaria de codificación y decodificación árbol de búsqueda
La búsqueda binaria (ordenados) define árbol
La búsqueda binaria nodo de inserción de árbol
Búsqueda binaria árbol para encontrar el valor
Binaria de codificación y decodificación árbol de búsqueda
LeetCode 449.Serialize y Deserialize BST
Dado un árbol binario de búsqueda, mirada a los árboles para lograr la codificación y decodificación de la funcionalidad binario. La codificación binaria se trata de árbol de búsqueda en una cadena, la cadena de decodificar el próximo árbol de búsqueda binaria. Sin limitar lo algoritmo de codificación para su uso, sólo para asegurarse de que cuando la llamada a la función de codificación binaria árbol de búsqueda puede recordar la decodificación para recuperar.
idea general
codificación
la decodificación
Los detalles de diseño
codificación parte
sección de la decodificación
la implementación del código
#include <stdio.h>
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
#include <string>
#include <vector>
void BST_insert(TreeNode *node, TreeNode *insert_node){
if (insert_node->val < node->val){
if (node->left){
BST_insert(node->left, insert_node);
}
else{
node->left = insert_node;
}
}
else{
if (node->right){
BST_insert(node->right, insert_node);
}
else{
node->right = insert_node;
}
}
}
void change_int_to_string(int val, std::string &str_val){
std::string tmp;
while(val){
tmp += val % 10 + '0';
val = val / 10;
}
for (int i = tmp.length() - 1; i >= 0; i--){
str_val += tmp[i];
}
str_val += '#';
}
void BST_preorder(TreeNode *node, std::string &data){
if (!node){
return;
}
std::string str_val;
change_int_to_string(node->val, str_val);
data += str_val;
BST_preorder(node->left, data);
BST_preorder(node->right, data);
}
class Codec {
public:
std::string serialize(TreeNode* root) {
std::string data;
BST_preorder(root, data);
return data;
}
TreeNode *deserialize(std::string data) {
if (data.length() == 0){
return NULL;
}
std::vector<TreeNode *> node_vec;
int val = 0;
for (int i = 0; i < data.length(); i++){
if (data[i] == '#'){
node_vec.push_back(new TreeNode(val));
val = 0;
}
else{
val = val * 10 + data[i] - '0';
}
}
for (int i = 1; i < node_vec.size(); i++){
BST_insert(node_vec[0], node_vec[i]);
}
return node_vec[0];
}
};
void preorder_print(TreeNode *node,int layer){
if (!node){
return;
}
for (int i = 0; i < layer; i++){
printf("-----");
}
printf("[%d]\n", node->val);
preorder_print(node->left, layer + 1);
preorder_print(node->right, layer + 1);
}
int main(){
TreeNode a(8);
TreeNode b(3);
TreeNode c(10);
TreeNode d(1);
TreeNode e(6);
TreeNode f(15);
a.left = &b;
a.right = &c;
b.left = &d;
b.right = &e;
c.left = &f;
Codec solve;
std::string data = solve.serialize(&a);
printf("%s\n", data.c_str());
TreeNode *root = solve.deserialize(data);
preorder_print(root, 0);
return 0;
}
Número inversa
LeetCode 315.Count de los números más pequeño después de Auto
nums de matriz conocidos, novedad recuento array, recuento representa un número en la derecha y nums [i] de nums [i] elementos más pequeños [i].
idea general
Los detalles de diseño
la implementación del código
#include <stdio.h>
#include <vector>
struct BSTNode {
int val;
int count;
BSTNode *left;
BSTNode *right;
BSTNode(int x) : val(x), left(NULL), right(NULL), count(0) {}
};
void BST_insert(BSTNode *node, BSTNode *insert_node, int &count_small){
if (insert_node->val <= node->val){
node->count++;
if (node->left){
BST_insert(node->left, insert_node, count_small);
}
else{
node->left = insert_node;
}
}
else{
count_small += node->count + 1;
if (node->right){
BST_insert(node->right, insert_node, count_small);
}
else{
node->right = insert_node;
}
}
}
class Solution {
public:
std::vector<int> countSmaller(std::vector<int>& nums) {
std::vector<int> result;
std::vector<BSTNode *> node_vec;
std::vector<int> count;
for (int i = nums.size() - 1; i >= 0; i--){
node_vec.push_back(new BSTNode(nums[i]));
}
count.push_back(0);
for (int i = 1; i < node_vec.size(); i++){
int count_small = 0;
BST_insert(node_vec[0], node_vec[i], count_small);
count.push_back(count_small);
}
for (int i = node_vec.size() - 1; i >= 0; i--){
delete node_vec[i];
result.push_back(count[i]);
}
return result;
}
};
int main(){
int test[] = {5, -7, 9, 1, 3, 5, -2, 1};
std::vector<int> nums;
for (int i = 0; i < 8; i++){
nums.push_back(test[i]);
}
Solution solve;
std::vector<int> result = solve.countSmaller(nums);
for (int i = 0; i < result.size(); i++){
printf("[%d]", result[i]);
}
printf("\n");
return 0;
}