Esempio n. 1
0
_tree_node *tree_seek(_tree_node *node,_tree_data *data){
    if(node==NULL){
        return NULL;
    }

    if(data->n<node->data->n){
        return tree_seek(node->left,data);
    }else if(data->n<node->data->n){
        return tree_seek(node->right,data);
    }
    return node;
}
Esempio n. 2
0
int tree_del(tree_t *root ,Item item){
  node_t *to_be_del,*parent,*n,*p;
  int val;
  val=tree_seek(root,root->root,item,&to_be_del,&parent);
  if (val==-1) return -1;       /* 如果没找到要删除的 */
  /* int cmp=item_cmp(&(root->root->item),&item); */
  /* 根据 to_be_del的子节点个数分别进行处理 */
  if(to_be_del->left==NULL && to_be_del->right ==NULL){ /* 无左右子树, */
    if(parent==NULL){           /* 如果 to_be_del是根 */
      root->root=NULL;
    }else{
      /* 无子树,直接将此节点删了,然后其其父节点指向null */
      /* 需要得到其父节点,以便致空 */
      if (parent->right==to_be_del){ /* to_be_del是parent的右子树 */
        parent->right=NULL;
      }else{                      /* parent 是to_be_del的父 节点,故不必考虑两者相等状*/
        parent->left=NULL;
      }
    }
  }else if(to_be_del->left==NULL && to_be_del->right !=NULL){ /* 无左子树, */
    if(parent==NULL){/* 如果 to_be_del是根 */
      root->root=to_be_del->right;
    }else{
      if(parent->right==to_be_del){ /* to_be_del是parent的右子树 */
        parent->right=to_be_del->right;
      }else{                      /* parent 是to_be_del的父 节点,故不必考虑两者相等状*/
        parent->left=to_be_del->right;
      }
    }
  }else if(to_be_del->left!=NULL && to_be_del->right ==NULL){ /* 无右子树, */
    if(parent==NULL){/* 如果 to_be_del是根 */
      root->root=to_be_del->left;
    }else{
      if(parent->right==to_be_del){ /* to_be_del是parent的右子树 */
        parent->right=to_be_del->left;
      }else{                      /* parent 是to_be_del的父 节点,故不必考虑两者相等状*/
        parent->left=to_be_del->left;
      }
    }
  }else if(to_be_del->left!=NULL && to_be_del->right !=NULL){ /* 有左右子树, */
    tree_largest(to_be_del->left,&n,&p);                      /* 找到 to_be_del左子树中的最大值,存到n中,其父节点则存到p */
    if(p==NULL){                                              /* 左子树只有一个叶子节点,只须让to_be_del->left 代替to_be_del的原来位置即可 */
      if(parent==NULL){                                       /* to_be_del是根 */
        /* to_be_del->left是叶子节点,让其成为root,代代替 to_be_del,并将其指向 to_be_del的右节点 */
        root->root=to_be_del->left;
        root->root->right=to_be_del->right;
      }else{
        if(parent->right==to_be_del){ /* to_be_del是parent的右子树 */
          parent->right=to_be_del->left;
        }else{                      /* parent 是to_be_del的父 节点,故不必考虑两者相等状*/
          parent->left=to_be_del->left;
        }
        n->right = to_be_del->right;
      }
    }else{                     /* n!=NULL,p!=NULL */
      p->right=NULL;            /* p不在指向这个刚到的最大值n,因为要把n移到 to_be_del的位置 */
      n->left=to_be_del->left;
      n->right=to_be_del->right;
      if(parent==NULL){
        root->root=n;
      }else{
        if(parent->right==to_be_del){ /* to_be_del是parent的右子树 */
          parent->right=n;
        }else{                      /* parent 是to_be_del的父 节点,故不必考虑两者相等状*/
          parent->left=n;
        }
      }
    }
  }
  free_node(to_be_del);
  root->size--;
  return 0;
}