美文网首页
二叉树搜索树

二叉树搜索树

作者: 文蜘蛛 | 来源:发表于2019-12-07 22:01 被阅读0次

二叉树搜索树具有较高的搜索效率,并能支持插入和删除运算

性质:1.若左子树不空,则左子树上所有节点的关键字值均小于根节点的关键字值

        2.若右子树不空,则右子树上所有节点的关键字值均大于根节点的关键字值

        3.左右子树也分别是二叉搜索树

实现代码如下:

/**
*   二叉搜索树
*/
 
#include <iostream>
 
using namespace std;
 
class TreeNode
{
private:
    int element;
    TreeNode *lchild,*rchild;
    friend class BSTree;
};
 
class BSTree
{
private:
    TreeNode *root;
public:
    BSTree(int x);                      //创建二叉搜索树
    ~BSTree();
    void Clear(TreeNode*);
    bool InsertTree(int x);             //插入元素到二叉搜索树
    TreeNode* GetRoot(){return root;}   //获取二叉搜索树的根节点
    TreeNode* SearchTree(int x);
    bool DeleteTree(int x);             //删除元素x
    void PreOrder();         //先序遍历二叉树
    void PreOrder(TreeNode*);
    void InOrder();          //中序遍历二叉树
    void InOrder(TreeNode*);
    void BackOrder();        //后序遍历二叉树
    void BackOrder(TreeNode*);
};
 
BSTree::BSTree(int x)
{
    root=new TreeNode;
    root->element=x;
    root->lchild=NULL;
    root->rchild=NULL;
}
 
BSTree::~BSTree()
{
    TreeNode *r=root;
    Clear(r);
}
 
void BSTree::Clear(TreeNode *r)
{
    if(r)
    {
        Clear(r->lchild);
        Clear(r->rchild);
        delete r;
    }
}
 
bool BSTree::InsertTree(int x)
{
    TreeNode *p=root,*q=NULL;
    while(p)
    {
        q=p;
        if(x<p->element)
        {
            p=p->lchild;
        }
        else if(x>p->element)
        {
            p=p->rchild;
        }
        else
        {
            cout<<"插入数据重复"<<endl;
            return false;
        }
    }
    p=new TreeNode;
    p->element=x;
    p->lchild=NULL;
    p->rchild=NULL;
    if(p->element<q->element)
    {
        q->lchild=p;
    }
    else if(p->element>q->element)
    {
        q->rchild=p;
    }
    else
    {
        cout<<"插入数据重复"<<endl;
        return false;
    }
    return true;
}
 
void BSTree::PreOrder()
{
    TreeNode *r=this->root;
    PreOrder(r);
}
 
void BSTree::PreOrder(TreeNode *r)
{
    if(r)
    {
        cout<<r->element<<'\t';
        PreOrder(r->lchild);
        PreOrder(r->rchild);
    }
}
 
void BSTree::InOrder()
{
    TreeNode *r=this->root;
    InOrder(r);
}
 
void BSTree::InOrder(TreeNode *r)
{
    if(r)
    {
        InOrder(r->lchild);
        cout<<r->element<<'\t';
        InOrder(r->rchild);
    }
}
 
void BSTree::BackOrder()
{
    TreeNode *r=this->root;
    BackOrder(r);
}
 
void BSTree::BackOrder(TreeNode *r)
{
    if(r)
    {
        BackOrder(r->lchild);
        BackOrder(r->rchild);
        cout<<r->element<<'\t';
    }
}
 
TreeNode* BSTree::SearchTree(int x)
{
    TreeNode *p=root;
    while(p)
    {
        if(p->element==x)
        {
            cout<<"我们找到了"<<x<<endl;
            return p;
        }
        else if(x<p->element)
        {
            p=p->lchild;
        }
        else
        {
            p=p->rchild;
        }
    }
    cout<<"我们没有找到"<<x<<endl;
}
 
bool BSTree::DeleteTree(int x)
{
    TreeNode *p=root;
    TreeNode *s=NULL,*r=NULL,*q=NULL,*c=NULL;
    while(p&&p->element!=x)
    {
        q=p;
        if(x<p->element)
            p=p->lchild;
        else
            p=p->rchild;
    }
    if(p->lchild&&p->rchild)    //p节点有两个非空子树
    {
        //寻找p的中序遍历下的直接后继
        s=p->rchild;
        r=p;
        while(s->lchild)
        {
            r=s;
            s=s->lchild;
        }
        p->element=s->element;
        p=s;
        q=r;
    }
    if(!p)
        return false;
    if(p->lchild)
    {
        c=p->lchild;
    }
    else
    {
        c=p->rchild;
    }
    if(p==root)
        root=c;
    else if(p==q->lchild)
    {
        q->lchild=c;
    }
    else
    {
        q->rchild=c;
    }
    delete p;
    return true;
}
 
int main()
{
    BSTree a(28);
    a.InsertTree(21);
    a.InsertTree(36);
    a.InsertTree(25);
    a.InsertTree(33);
 
    a.PreOrder();
    cout<<endl;
    a.InOrder();
    cout<<endl;
    a.BackOrder();
    cout<<endl;
    a.DeleteTree(36);
    a.PreOrder();
    return 0;
}

相关文章

  • 树,二叉树,搜索树

    树,二叉树,搜索树 资料 二叉搜索树 Demo 树的遍历 Demo 题目 ◎ 二叉树的中序遍历 ◎ 二叉树...

  • 二叉树基础

    二叉树的分类 完全二叉树与满二叉树 二叉搜索树BST 平衡二叉搜索树BBST因为二叉搜索树有可能退化为链表,降低查...

  • 2019 算法面试相关(leetcode)--树、二叉树、二叉搜

    翻转二叉树二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历验证二叉搜索树二叉树的最近公共祖先二叉搜索树的最近公共祖...

  • 二叉树数据结构及其算法操作(Java)

    二叉树的定义 向二叉树中插入节点 搜索二叉树中最大值和最小值 搜索二叉树的深度(height)和节点数(size)...

  • 线索二叉树&哈夫曼编码

    一、搜索二叉树 线索二叉树优点: 节约内存,便于搜索 二叉树构造 //Link==0表示指向左右孩子指针//Thr...

  • Avl平衡树--C语言实现

    Avl 平衡树 实现记录 Avl平衡二叉树和搜索二叉树基本实现原理相同,在搜索二叉树的基础上添加树平衡的操作--单...

  • Swift实现搜索二叉树(BST)

    Swift实现搜索二叉树(BST) 二叉搜索树(BST)关于索索二叉树这里有详细的教程,下面我们主要针对二叉树的一...

  • 【数据结构】红黑树

    1、什么是红黑树? 红黑树是一个要求不那么严格的平衡二叉树搜索树(平衡二叉搜索树/AVL树=平衡二叉树+二叉搜索树...

  • 数据结构之二叉搜索树(Binary Search Tree)

    二叉树搜索树 每个节点最多含有两个子树的树称为二叉树;二叉树搜索树对于任意一个节点均满足: 所有位于左子树的节点值...

  • 红黑树

    一、二叉搜索树 二叉搜索树,也称有序二叉树,排序二叉树,具有以下特性: 1、是一棵二叉树 2、若任意节点的左子树不...

网友评论

      本文标题:二叉树搜索树

      本文链接:https://www.haomeiwen.com/subject/pvlpgctx.html