[英]In Order and Pre Order Traversal of Binary Search Tree without recursion in C?
[英]C Binary Search Tree pre-order traversal with recursion
我正在研究一个函数,该函数通过C中的二进制搜索树搜索随该函数传递的名称。 但是,我坚持如何格式化循环,以便遍历到达没有子级的最左边节点时,回退不会简单地结束。 遍历必须是预定的(先拜访自己,然后是我的左孩子,然后是我的右孩子)。
我的查找功能如下:
tnode *bst_find_by_name(tnode *ptr, const char *nom){
if(ptr != NULL){
if(strcmp(ptr->name, nom) == 0){
return ptr;
}
if(ptr->left != NULL){
return bst_find_by_name(ptr->left, nom);
}
if(ptr->right != NULL){
return bst_find_by_name(ptr->right, nom);
}
}
return NULL;
}
如您所见,当前,一旦到达与传递给函数的字符串不匹配的最左边的节点,它就简单地返回NULL。 如果在树中找不到匹配项,我必须让它返回NULL,但是同时我不希望它在有机会搜索树中的每个节点之前过早返回NULL。 有任何想法吗?
创建一个保存返回值的临时变量。 并检查bst_find_by_name
返回了非NULL的值(如果它返回NULL),则继续检查树。
类似于以下内容。
tnode *ret = NULL;
if(ptr->left != NULL){
ret = bst_find_by_name(ptr->left, nom);
}
if(ret == NULL && ptr->right != NULL){
ret = bst_find_by_name(ptr->right, nom);
}
return ret;
我更喜欢这样写:
tnode *bst_find_by_name(tnode *ptr, const char *nom) {
// accept a null node, just exit early before dereferencing it
if (ptr == NULL) {
return NULL;
}
// is it this node?
if(strcmp(ptr->name, nom) == 0){
return ptr;
}
// remember, if the first part is true, || will skip the second part
return bst_find_by_name(ptr->left, nom) || bst_find_by_name(ptr->right, nom)
}
// get the matching pointer for left or right subtree, and return
tnode *bst_find_by_name(tnode *ptr, const char *nom) {
// accept a null node, just exit early before dereferencing it
if (ptr == NULL) {
return NULL;
}
// is it this node?
if(strcmp(ptr->name, nom) == 0){
return ptr;
}
tnode * ptrtemp = bst_find_by_name(ptr->left, nom);
if(!ptrtemp) {
ptrtemp = bst_find_by_name(ptr->right, nom);
}
return ptrtemp;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.