在BST中查找前身

时间:2019-05-10 17:22:13

标签: c binary-search-tree

我想在不使用父指针的情况下在二进制搜索树中递归和有效地搜索前身。 我给出了树的根和某些数据(可以在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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

鉴于您希望前任以顺序遍历的方式结点 N ,有三种可能性:

  1. N 有一个左孩子。在这种情况下,前任元素是 N 左子树的最右侧元素。
  2. N 没有左孩子,并且从根到 N 的路径中至少有一个向右的步骤。在这种情况下,前任是该路径上最靠近 N 的向右步骤的源节点。
  3. N 没有左子,并且从根到它的路径上没有向右的步骤。在这种情况下, N 是树中的最小元素,因此它没有前任。

因此,您必须做的是跟踪最近的向右步进的源(不一定是直接父级),作为递归搜索功能的附加参数,通过该参数可以找到节点 N 。当您达到 N 时,如果 N 没有孩子的话,您便可以使用它了。 ,如果 N 确实有个左孩子,则可以忽略它。