C中的递归和树搜索?

一种新的树木和递归功能.... 我知道如何创建堆栈以及如何创建递归函数的基础知识。 我正在进行预先排序的遍历搜索,当搜索的值与该节点的值匹配时,该搜索应返回树中节点的地址。 我在返回部分遇到问题...我试着在调用堆栈上读取一些东西......但我不明白如何实现它。它已经存在或者我必须制作这个堆栈吗?如果我必须制作它,我该如何制作这个堆栈?我读到它需要与树的高度成正比...是找到树高的最佳方法来制作另一个函数吗? 这是我到目前为止编写的一些代码: Tree和NodePtr是一个指向节点的指针......
NodePtr SearchTree(int v, Tree T)
{
    //printf(" %i n", T->value);

    if(T->value == v) 
    {
        return T;
    }
    else
    {
        if(T->Left != NULL) SearchTree(value, T->Left);
        if(T->Right != NULL) SearchTree(value, T->Right);
    }

    return NULL;
}
    
已邀请:
首先,看看递归。 现在,你想要返回递归调用
SearchTree()
返回的内容,因为你正在使用递归将问题委托给自己的两个实例,所以如果你没有得到你的返回值,那么没有什么不可能工作:
NodePtr SearchTree(int v, Tree t)
{
    printf(" %i n", t->value);
    if (t->value == v) {
        return t;
    } else {
        if (t->Left != NULL) {
            NodePtr left = SearchTree(v, t->Left);
            if (left != NULL) {
                return left;
            }
        }
        if (t->Right != NULL) {
            return SearchTree(v, t->Right);
        }
    }

    return NULL;
}
    
你不需要担心调用堆栈;它是如何工作的是C编译器隐藏的,除非你正在搜索令人难以置信的深树,否则它不会打扰你。 您的算法或多或少是正确的,但在访问其他子树之前,您需要检查递归调用的返回值以查看它是否为null。就像是:
    if(T->Left != NULL) { NodePtr temp=SearchTree(value, T->Left); 
                          if (temp !=NULL)  return temp; 
                        } 
    if(T->Right != NULL) return SearchTree(value, T->Right); 
    
您不需要自己创建调用堆栈。它是一个数据结构,由执行程序的运行时环境(如操作系统或Java虚拟机)维护,如果您使用的是Java。每当调用一个函数时,它的参数和它的局部变量都被压入堆栈。当函数存在时,它们会弹出。 作为程序员,您通常不必担心它。它有助于了解调用堆栈是什么来准确理解在递归函数调用(或任何函数调用)期间发生的事情,或者了解局部变量的来源或函数退出后发生的变化。     
Ira Baxter的回答和FrédéricHamidi的回答中的所有特殊情况表明设计不太正确:
NodePtr SearchTree(int v, NodePtr T)
{
    if (T == NULL || T->value == v)
        return T;
    NodePtr R = SearchTree(v, T->Left);
    if (R == NULL)
        R = SearchTree(v, T->Right);
    return R;
}
这是,我恭敬地提交,更简单。当然,它在处理NULL叶节点时再进行一次函数调用,但是散布的'if null'测试更少。 此外,我认为函数的参数(名义上是原始的树)与NodePtr的类型相同,所以我选择仅使用NodePtr而不是Tree。树由NodePtr表示,NodePtr是树的根节点。     

要回复问题请先登录注册