zoukankan      html  css  js  c++  java
  • 二叉排序树之删除结点

    删除二叉排序树中值为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结点
    		}
    	}
    }
    
  • 相关阅读:
    PHP ffmpeg详解简单上手 window64 音频amr转mp3
    PHP强制转换类型
    PHP使用array_unique对二维数组去重处理
    发布包
    CSS用户界面样式
    数组
    结构类型(枚举,结构,联合)
    循环
    程序结构
    文件
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/2645859.html
Copyright © 2011-2022 走看看