Loading... ```cpp #include <stdlib.h> #include <stdio.h> typedef struct node { int k; struct node *l,*r; }BT; BT* INSBT(BT *root,BT *new_T) { BT *p = root; if(root==NULL) root=new_T; else while(p->k!=new_T->k) if(p->k<new_T->k) if(p->r==NULL) { p->r=new_T; break; } else p=p->r; else if(p->l==NULL) { p->l=new_T; break; } else p=p->l; return root; } BT* CREABT(int n) { BT *root,*new_T; int i,key; for(root=NULL,i=1;i<=n;i++) { scanf("%d",&key); new_T=(BT*)malloc(sizeof(BT)); new_T->k=key; new_T->l=new_T->r=NULL; root=INSBT(root,new_T); } return root; } BT* SEARBT(BT *root,int key) { BT *p; for(p=root;p!=NULL&&p->k!=key;) if(p->k<key) p=p->r; else p=p->l; return p; } BT* DELBT(BT *root, int key) { // 删除key BT *p,*q,*f; for(q=NULL,p=root;p!=NULL&&p->k!=key;) // 遍历找到key { q=p; // p 是父节点,q是当前节点 if(key<p->k) p=p->l; else p=p->r; } if(p->k==key) { if(p->l==NULL) if(q->l==p) q->l=p->r;else q->r=p->r; // p父节点左子树为空, else { // p父节点左子树不为空 f=p; for(;p->r!=NULL;q=p,p=p->r); // 沿着左子树的右孩子,右到底 f->k=p->k; q->r=p->l; // 将得到最右边的节点连接到q节点的左子树 } free(p); } return root; } void INBT(BT *root) { if(root!=NULL) { INBT(root->l); printf("%d ",root->k); INBT(root->r); } } int main() { BT *root,*p;int n,key; scanf("%d",&n); root=CREABT(n); INBT(root); scanf("%d",&key); p=SEARBT(root,key); if(p==NULL) printf("\nno exit"); else printf("\n%d",p->k); root=DELBT(root,key); printf("\n"); INBT(root); return 0; } ``` 最后修改:2021 年 12 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏