二叉排序樹之刪除結點


刪除二叉排序樹中值為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結點
		}
	}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM