C++ 二叉搜索树中的递归堆栈

C++ 二叉搜索树中的递归堆栈,c++,binary-search-tree,C++,Binary Search Tree,我试图从二叉搜索树中删除一个节点。当这个函数正常工作时,为什么我们需要设置node->m_left或node->m_right来返回deletenode函数本身的值?很难理解这种递归结构。 当前仅对叶节点执行此操作 Node<T>* deletenode(T key){ return deletenode(key,this->root); } Node<T>* deletenode(T key,Node<T

我试图从二叉搜索树中删除一个节点。当这个函数正常工作时,为什么我们需要设置node->m_left或node->m_right来返回deletenode函数本身的值?很难理解这种递归结构。
当前仅对叶节点执行此操作

Node<T>*  deletenode(T key){
         return deletenode(key,this->root);
        }
        Node<T>*  deletenode(T key,Node<T>* node){
            Node<T>* temp;
         if(node==nullptr){
             return node;
         }
         if(key<node->m_data){
             node->m_left=deletenode(key,node->m_left);
         }
         if(key>node->m_data){
             node->m_right=deletenode(key,node->m_right);
         }
          
         

         return temp;
        }
        
        
Node*deletenode(T键){
返回deletenode(key,this->root);
}
节点*删除节点(T键,节点*节点){
节点*温度;
if(node==nullptr){
返回节点;
}
if(键控数据){
node->m_left=删除节点(键,node->m_left);
}
如果(键>节点->m_数据){
节点->鼠标右键=删除节点(键,节点->鼠标右键);
}
返回温度;
}

您将左边或右边设置为调用该分支上的deletenode函数的结果,而不是函数本身


递归的意思是:“如果我的树有一个左分支和一个右分支,并且要删除的项位于左分支中,那么创建一个新的树,该树具有相同的右分支,但其结果是将要删除的项作为其左分支从左分支中删除”

您将左边或右边设置为调用该分支上的deletenode函数的结果,而不是函数本身


递归的意思是:“如果我的树有一个左分支和一个右分支,并且要删除的项位于左分支中,那么创建一个新的树,该树具有相同的右分支,但是将要删除的项作为其左分支从左分支中删除的结果”

如果它的值在函数中没有更改,则不必返回节点。否则您需要返回,因为函数在其自己的传递指针副本上运行,并且调用方将不知道更改,除非重新分配给返回的值是否需要?可以编写一个不需要的递归函数。你到底在问什么?@Beta为什么我们要设置“node->m_left=deletenode(key,node->m_left)”,这样如果
m_left
指向要删除的节点,调用
deletenode
将返回
nullptr
,我们将
m_left
设置为该值。如果节点的值在函数中没有更改,则不必返回该节点。否则您需要返回,因为函数在其自己的传递指针副本上运行,并且调用方将不知道更改,除非重新分配给返回的值是否需要?可以编写一个不需要的递归函数。你到底在问什么?@Beta为什么我们要设置这个“node->m_left=deletenode(key,node->m_left);”这样,如果
m_left
指向要删除的节点,那么对
deletenode
的调用将返回
nullptr
,我们将
m_left
设置为该值。一棵大树由左右两棵小树组成。如果从左树中删除一个项目,然后从右树中删除该项目,则该项目不再位于大树中。你已经把它从大树上删除了。如果左树和右树也是大树,那么从中删除的方法就是sameA大树由两棵小树组成,左树和右树。如果从左树中删除一个项目,然后从右树中删除该项目,则该项目不再位于大树中。你已经把它从大树上删除了。如果左树和右树也是大树,则从中删除的方式完全相同