I use hcreate()
, hdestroy()
and hsearch()
from C standard library
for hashmap implementation.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| #define _GNU_SOURCE
#include <search.h>
#include <errno.h>
#define MAX_SIZE 1e4
#define KEY_SIZE 20
ENTRY* create_entry_set_number( int data );
bool dfs( struct TreeNode*, int );
bool findTarget(struct TreeNode* root, int k)
{
hcreate( MAX_SIZE );
const bool res = dfs( root, k );
hdestroy();
return res;
}
bool dfs( struct TreeNode* node, int target )
{
if ( !node ) return false;
const ENTRY* required = create_entry_set_number( target - node -> val );
const ENTRY* cur_node = create_entry_set_number( node -> val );
if ( hsearch( *required, FIND ) )
return true;
else
hsearch( *cur_node, ENTER );
return dfs( node -> left, target ) || dfs( node -> right, target );
}
ENTRY* create_entry_set_number( int data )
{
ENTRY* item = ( ENTRY* ) malloc( sizeof(ENTRY) );
if ( !item ) exit(-ENOMEM);
*item = ( ENTRY ) { .key = NULL, .data = NULL };
item -> key = (char*) reallocarray( item->key, KEY_SIZE, sizeof(char) );
sprintf( item -> key, "%d", data );
return item;
}
|