java里面有radix树吗_radix tree基数树实现 (山寨nginx风格)

#include 

#include 

#include 

using namespace std;

typedef struct radix_node_s radix_node_t;

struct radix_node_s

{

radix_node_t *left;

radix_node_t *right;

radix_node_t *parent;

string          key;

string        value; //more general definition : void* data

radix_node_s():left(NULL),right(NULL),parent(NULL),key(""),value(""){}

};

struct radix_tree_t

{

radix_node_t *root;

radix_tree_t()

{

root = new radix_node_t;

}

};

static void radix_tree_insert(radix_tree_t* T, string key, string value)

{

int i = 0;

radix_node_t *node,*child;

node = T->root;

for (i = 0; i 

{

if(key[i] == '0')//insert left

{

if(node->left == NULL)

{

child = new radix_node_t();

assert( child != NULL);

child->parent = node;

node->left = child;

node = node->left;

//cout <

}

else

{

//cout <

node = node->left;

}

}

else//right

{

if(node->right == NULL)

{

child = new radix_node_t();

assert( child != NULL);

child->parent = node;

node->right = child;

//cout <

node = node->right;

}

else

{

//cout <

node = node->right;

}

}

}

node->value = value;

//cout <

}

/*

preorder traversal

*/

static inline void radix_print(radix_node_t* T)

{

if(T == NULL)

{

return;

}

if(T->value != "")

{

cout <value <

}

radix_print(T->left);

radix_print(T->right);

}

string  radix_tree_find(radix_tree_t* T, string key)

{

radix_node_t *node;

string radix_value("radix_null_value");

node = T->root;

int i = 0;

while(node)

{

if(key[i] == '0')

{

node = node->left;

}

else

{

node = node->right;

}

i++;

if(i == (int)key.length())

{

break;

}

}

if(node == NULL)

{

return radix_value;

}

if(node->value != "")

{

radix_value = node->value;

}

return radix_value;

}

int radix_tree_delete(radix_tree_t* T, string key)

{

radix_node_t* node;

node = T->root;

#define RADIX_ERROR -1

#define RADIX_OK     0

string radix_value("");

int i = 0;

while(node)

{

if(key[i] == '0')

{

node = node->left;

}

else

{

node = node->right;

}

i++;

if(i == (int)key.length())

{

break;

}

}

//find no such key

if(node == NULL)

{

return RADIX_ERROR;

}

//find the key but not the last

if(node->left || node->right)

{

if(node->value != "")

{

node->value = radix_value;

return RADIX_OK;

}

return RADIX_ERROR;

}

//the last

for(;;)

{

if(node->parent->right == node)//right

{

node->parent->right = NULL;

}

else//left

{

node->parent->left = NULL;

}

node = node->parent;

if(node->left || node->right)//not the leaf node

{

break;

}

if(node->value != "")//has data

{

break;

}

if(node->parent == NULL)//reach the root

{

break;

}

}

return RADIX_OK;

}

//TEST

int main()

{

string str, key, val;

radix_tree_t* T = new radix_tree_t;

assert( T != NULL);

while(1)

{

cin >> str;

if(str == "I")

{

cin >> key >> val;

radix_tree_insert(T, key, val);

}

else if(str == "P")

{

radix_print(T->root);

cout <

break;

}

}

string s_key;

cout <> s_key;

cout <

cout <

if(radix_tree_delete(T, s_key) == 0)

{

cout <

}

else

{

cout <

}

//test search after delete

cout <

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值