刪除二叉排序樹中值為k的結點
用被刪結點左子樹最右下的結點的值代替被刪結點的值,然后刪去最右下的結點
#include "stdafx.h" #include<iostream> using namespace std; typedef struct BSTreeNode { int data; struct BSTreeNode *lchild,*rchild; }BSTree; int _tmain(int argc, _TCHAR* argv[]) { return 0; } void Delete(BSTree *bst,int x) { BSTree *f,*p=bst; while(p&&p->data!=x)//查找值為x的結點 { if(p->data>x) { f=p;p=p->lchild; } else { f=p;p->rchild; } } if(p==NULL)exit(0);//沒找到 if(p->lchild==NULL)//被刪結點沒有左子樹,直接將右子樹接到其雙親上 { if(f->lchild==p)f->lchild=p->rchild; else f->rchild=p->rchild; } else//被刪結點有左子樹 { BSTree *q=p->lchild,*s=q; while(q->rchild!=NULL)//查找左子樹最右下的結點(中序最后結點) { s=q;q=q->rchild; } if(s==p->lchild)//p左子樹的根結點無右子女 { p->data=s->data; p->lchild=s->lchild; free(s); } else { p->data=q->data; s->rchild=q->lchild; free(q);//刪除q結點 } } }
另一種方法:
用被刪結點右子樹最左下的結點的值代替被刪結點的值,然后刪去最左下的結點
void Delete(BSTree *bst,int x) { BSTree *f,*p=bst; while(p&&p->data!=x)//查找值為x的結點 { if(p->data>x) { f=p;p=p->lchild; } else { f=p;p->rchild; } } if(p==NULL)exit(0);//沒找到 if(p->rchild==NULL)//被刪結點沒有右子樹,直接將左子樹接到其雙親上 { if(f->lchild==p)f->lchild=p->lchild; else f->rchild=p->lchild; } else//被刪結點有右子樹 { BSTree *q=p->rchild,*s=q; while(q->lchild!=NULL)//查找右子樹最左下的結點(中序最先結點) { s=q;q=q->lchild; } if(s==p->rchild)//p左子樹的根結點無左子女 { p->data=s->data; p->rchild=s->rchild; free(s); } else { p->data=q->data; s->lchild=q->rchild; free(q);//刪除q結點 } } }