2013微软北京面试题

       今天在实验室,看见实验室一师兄在微软面试,直接网上面试,直接敲代码,边敲边讲思路,题目是“在2叉排序树里面删除节点”,发现他问的东西好细,如果不是自己做的肯定要问出来,所以一定要搞清楚自己做的东西里面的原理以及实现。基础的数据结构与算法很重要,来这边读研期间不能丢,今天时间不够,就网上找下写这道题目的代码,没有自己实现,先贴上,过几天自己实现。

删除二叉排序树中值为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结点

        }

    }

} 



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值