• 二叉排序树之删除结点


    删除二叉排序树中值为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结点
    		}
    	}
    }
    
  • 相关阅读:
    server 2012 r2 配置
    在线流媒体nginx/Windows解决方案
    ECS上配置FTP Filezilla
    新项目扫雷专贴 备忘录
    如何解决 Windows 实例出现身份验证错误及更正 CredSSP
    win10 再次重装系统
    SAI窗口无法移动
    无法将分支 master 发布到远程 origin,因为远程存储库中已存在具有同一名称的分支
    遇到技嘉 Gigabyte UEFI DualBIOS问题
    dnsunlocker解决
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/2645859.html
Copyright © 2020-2023  润新知