You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二叉树节点递归查找的更优实现方式咨询

二叉树节点递归查找的更优实现方式咨询

嘿各位,我刚完成作业里的二叉树节点查找功能,写了一段递归代码,但总觉得绕了弯路,想请教下有没有更简洁的递归实现方式。

先贴我最初写的代码:

typedef struct NODE {
    int key;
    struct NODE *left, *right;
} Node;

Node *search(Node *head, int key) {
    if (!head) return 0;
    if (head->key == key) return head;
    return or(search(head->left, key), search(head->right, key));
}

Node *or(void *ptr1, void *ptr2) {
    Node *temp = (Node *)((long)ptr1 | (long)ptr2);
    return temp;
}

我的思路是递归遍历左右子树,没找到返回NULL,找到就返回节点地址。当时脑抽搞了个按位或操作指针,想着这样只要任意一边找到节点,就能返回非零地址。代码能跑,但这指针操作完全是画蛇添足,感觉复杂过头了。

(编辑补充:后来我突然反应过来,其实完全不用搞这些花里胡哨的,直接这么写就行:

Node *left = search(head->left,key) ;
if(left) return left ;
else return search(head->right,key) ;

)


哈哈,你最后补充的这段代码就是最标准、最清爽的递归实现啦!

不得不说,你一开始用按位或操作指针的思路虽然能工作,但真的没必要——指针的位操作不仅可读性极差,还可能在一些特殊架构下(比如指针宽度和long不匹配的情况)埋下兼容性隐患,属于完全没必要的“炫技”操作。

标准的二叉树递归查找逻辑其实非常直白:

  1. 先判断当前节点是否为空,是空就直接返回NULL
  2. 如果当前节点的key正好匹配,直接返回当前节点
  3. 先递归查找左子树,如果左子树返回了非空指针(说明找到节点了),直接把这个结果返回
  4. 要是左子树没找到,再递归查找右子树,返回右子树的查找结果

把这个逻辑整理成完整的函数就是:

Node *search(Node *head, int key) {
    if (!head) {
        return NULL;
    }
    if (head->key == key) {
        return head;
    }
    Node *left_result = search(head->left, key);
    if (left_result) {
        return left_result;
    }
    return search(head->right, key);
}

这种写法逻辑清晰,一眼就能看懂,完全没有多余的复杂操作,就是递归查找二叉树节点的常规操作~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:04:30