当前位置:  编程技术>c/c++/嵌入式

二叉搜索树的插入与删除(详细解析)

    来源: 互联网  发布时间:2014-10-19

    本文导语:  题目:创建一个类,类中的数据成员时一棵二叉搜索树,对外提供的接口有添加结点和删除结点这两种方法。用户不关注二叉树的情况。要求我们给出这个类的结构以及实现类中的方法。 思路添加结点:添加结点其实很容易,...

题目:创建一个类,类中的数据成员时一棵二叉搜索树,对外提供的接口有添加结点和删除结点这两种方法。用户不关注二叉树的情况。要求我们给出这个类的结构以及实现类中的方法。

思路
添加结点:
添加结点其实很容易,我们只需要找到结点所行对应的位置就可以了,而且没有要求是平衡的二叉搜索树,因此每次添加结点都是在叶子结点上操作,不需要修改二叉搜索树整体的结构。要找出添加节点在二叉搜索树中的位置,可以用一个循环解决。判断插入结点与当前头结点的大小,如果大于头结点则继续搜索右子树,如果小于头结点则继续搜索左子树。直到搜索到叶子结点,此时进行插入结点操作。如果插入的结点等于二叉搜索树中当前某一结点的值,那么退出插入操作,并告知用户该结点已经存在。

删除结点:
删除结点比较麻烦,因为需要调整树的结构,这是因为删除结点并不一定发生在叶子结点。如果删除的是叶子结点,那么操作非常简单,只是做相应的删除就可以了,但如果删除的是非叶子结点,那么就需要调整二叉搜索树的结构。调整的策略有两个。假设当前需要删除的结点为A,

1.找出A结点左子树中的最大值结点B,将B调整到原先A的位置。
2.找出A结点右子树中的最小值结点C,将C调整到原先A的位置。

这其中涉及到许多复杂的指针操作,在下面的代码示例中并没有完成结点删除操作,等有空再补充研究一下。

代码示例

代码如下:

#include
#include
#include
using namespace std;

//二叉树结点
struct BinaryTreeNode
{
    int m_nValue;
    BinaryTreeNode* m_pLeft;
    BinaryTreeNode* m_pRight;
};

class BST
{
public:
    BST(int value);//构造函数
    ~BST();//析构函数
    void AddNode(int value);//添加结点
    void DeleteNode(int value);//删除结点
    BinaryTreeNode* CreateBinaryTreeNode(int value);//创建一个二叉树结点
    void InOrderPrintTree();//中序遍历
    void InOrderPrintTree(BinaryTreeNode* pRoot);//中序遍历
    BinaryTreeNode* GetMaxNode(BinaryTreeNode* pNode);//求二叉搜索树最大值
    BinaryTreeNode* GetMinNode(BinaryTreeNode* pNode);//求二叉搜索树最小值

private:
    BinaryTreeNode* pRoot;
};

//构造函数
BST::BST(int value)
{
    pRoot=CreateBinaryTreeNode(value);
}

//析构函数
BST::~BST()
{
    delete pRoot;
    pRoot=NULL;
}

//创建二叉树结点
BinaryTreeNode* BST::CreateBinaryTreeNode(int value)
{
    BinaryTreeNode* pNode=new BinaryTreeNode();
    pNode->m_nValue=value;
    pNode->m_pLeft=NULL;
    pNode->m_pRight=NULL;
    return pNode;
}

//求二叉搜索树最大值
BinaryTreeNode* BST::GetMaxNode(BinaryTreeNode* pNode)
{
    assert(pNode!=NULL); // 使用断言,保证传入的头结点不为空
    //最大值在右子树上,因此一直遍历右子树,让pNode等于其右子树;如果只有一个结点则直接返回pNode
    while(pNode->m_pRight!=NULL)
    {
        pNode=pNode->m_pRight;
    }
    return pNode;

}
//求二叉搜索树最小值
BinaryTreeNode* BST::GetMinNode(BinaryTreeNode* pNode)
{
    assert(pNode!=NULL); // 使用断言
    //最小值在左子树上,整体思路跟求最大值相同。
    while(pNode->m_pLeft!=NULL)
    {
        pNode=pNode->m_pLeft;
    }
    return pNode;
}
//二叉搜索树添加结点
void BST::AddNode(int value)
{
    BinaryTreeNode* pInsertNode=CreateBinaryTreeNode(value);//初始化需要创建的结点。
    BinaryTreeNode* pNode=pRoot;
    while(true)
    {
        //如果插入的值在二叉搜索树中已经存在,则不进行插入操作,跳出循环。
        if(pNode->m_nValue==value)
        {
            coutm_pLeft=pInsertNode;
                break;
            }
            else//否则继续遍历其左子树
                pNode=pNode->m_pLeft;
        }
        //思路跟上述相同
        else if(pNode->m_nValue < value)
        {
            if(pNode->m_pRight==NULL)
            {
                pNode->m_pRight=pInsertNode;
                break;
            }
            pNode=pNode->m_pRight;
        }
    }

}

//未完成
void BST::DeleteNode(int value)
{
    BinaryTreeNode* pNode=pRoot;
    while(true)
    {
        if(pRoot->m_nValue==value)//如果是头结点
        {
            if(pRoot->m_pLeft!=NULL)
            {
                BinaryTreeNode* pLeftMaxNode=GetMaxNode(pRoot->m_pLeft);
            }
            else if(pRoot->m_pRight!=NULL)
            {

            }
            else
            {
                delete pRoot;
                pRoot=NULL;
            }
        }

        if(pNode->m_nValue==value)
        {
            if(pNode->m_pLeft!=NULL)
            {

            }
            else if(pNode->m_pRight!=NULL)
            {

            }
            else
            {

            }
        }
    }
}
void BST::InOrderPrintTree(BinaryTreeNode* pRoot)//中序遍历
{
    if(pRoot!=NULL)
    {
        //如果左子树不为空,则遍历左子树
        if(pRoot->m_pLeft!=NULL)
            InOrderPrintTree(pRoot->m_pLeft);
        //遍历左子树的叶子结点
        cout


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux bash shell命令:grep文本搜索工具简介
  • VI搜索时怎样将复制的内容作为搜索的内容??
  • 通过docker search命令搜索可用docker镜像
  • 高分求救:如何在一个企业的自己的网站上设置搜索引擎,用来搜索本行业的信息,需要什么条件?
  • linux bash shell命令:文本搜索工具grep中用于egrep和 grep -E的元字符扩展集
  • 请问 如何修改hostname. 本站搜索未果,google搜索未果,看linux自带帮助未果.
  • linux bash shell命令:文本搜索工具Grep命令选项及实例
  • 列出该shell的搜索路径。如果搜索路径中不包括当前目录和
  • linux bash shell命令:文本搜索工具grep正则表达式元字符集(基本集)
  • 怎样用jsp做一个简单的关键字全文搜索,只要搜索一个目录中的文件即可(全是.htm文件)
  • 跪求一个按指定日期搜索文件,并把搜索到的文件复制到自定义的目录下的shell程序
  • 我用java做的applet站内搜索程序,不能搜索中文,那位大虾能帮帮我?代码如下:
  • 请教点击开始-->搜索-->文件和文件夹-->搜索选项-->日期-->介于选择日期的那个框怎么实现的??
  • Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
  • 常见问题常见问题 搜索搜索 团队团队 个人资料个人资料 您没有新的站内信件您没有新的站内信件 注销 [ tnt_bomb ]注销 [ tnt_b
  • 网站的站内搜索是怎么实现的?怎么做?在网页的头元素中有一关键词元素,是不是就是给站内搜索用的?如果我在Sina中登记我的网站,那么是不是
  • 开源搜索系统 Red-Piranha iis7站长之家
  • Google AJAX 搜索 API
  • 姓名搜索
  • 命令行的搜索工具 Surfraw
  • 开源搜索系统 Red-Piranha




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3