/**
* 算法思想:
* 与two sum相同,遍历整棵树,不断将节点值添加到hash表中,
* 当访问节点node时,现在hash表中查找target-node->val如果找到直接返回;
* 否则将当前节点值添加到hash表中,继续访问其他节点。
* };
*/
typedef struct has_node{
int key;
struct has_node *next;
}HNode;
#define LEN 0xfff
void hash_insert(HNode **hb, int key) {
int index = abs(key % LEN);
//printf("insert : %d\n", key);
HNode *node = (HNode *)malloc(sizeof(HNode));
node->key = key;
node->next = hb[index];
hb[index] = node;
}
HNode *hash_find(HNode **hb, int key) {
int index = abs(key % LEN);
//printf("find : %d\n", key);
HNode *node = hb[index];
while(node){
if(node->key == key) {
break;
}
node = node->next;
}
return node;
}
void hash_init(HNode **hb){
int i;
for(i=0; i<LEN; i++){
hb[i] = NULL;
}
}
void hash_exit(HNode **hb){
int i;
HNode *p, *last;
for(i=0; i<LEN; i++){
p = hb[i];
while(p){
last = p;
p = p->next;
free(last);
}
}
}
bool find(struct TreeNode *node , int k, HNode **hb){
if(!node) return false;
if(hash_find(hb, k-node->val)) {
return true;
}
hash_insert(hb, node->val);
return find(node->left, k, hb) || find(node->right, k, hb);
}
bool findTarget(struct TreeNode* root, int k){
if(!root) return false;
bool ret = false;
HNode **hb = (HNode **)malloc(sizeof(HNode *) * LEN);
hash_init(hb);
ret = find(root, k, hb);
hash_exit(hb);
free(hb);
return ret;
}
leetcode-653. 两数之和 IV - 输入 BST-C语言
最新推荐文章于 2022-10-03 19:37:59 发布