我想在不使用父指针的情况下在二进制搜索树中递归和有效地搜索前身。 我给出了树的根和某些数据(可以在BST中包含或不包含在其中)作为函数的参数。
我很麻烦,因为如果BST不包含数据,则该函数应在输出中给出小于它的最大值。
Node *recPredecessor(Node *root, int data, Node *pred){
if(root->key > data){
return recPredecessor(root->left, data, pred);
}
if(root->key < data){
return recPredecessor(root->right, data, root);
}
if((root == NULL) || (root->key == data)){
if(root == NULL){
return pred;
}
if(root->key == data){
if(root->left != NULL){
return bstRecGetMax(root->left); //this func return node with Max key
}else{
return pred;
}
}
}
}
答案 0 :(得分:2)
鉴于您希望前任以顺序遍历的方式结点 N ,有三种可能性:
因此,您必须做的是跟踪最近的向右步进的源(不一定是直接父级),作为递归搜索功能的附加参数,通过该参数可以找到节点 N 。当您达到 N 时,如果 N 没有孩子的话,您便可以使用它了。 ,如果 N 确实有个左孩子,则可以忽略它。