ACM-数据结构-二叉搜索树(C++实现)

近日研习《计算机算法》,一点点弄明白了二叉搜索树。

/*
@header      BSTree
@abstract    BSTree
@discussion  Insert,delete,search and order
@author      WalterBright,2016
*/

#include <iostream>
using namespace std;
template <class Type>
class BSTree;           //模板类作为友元类需提前声明
template <class Type>
class TreeNode{
public:
    friend class BSTree<Type>;
private:
    TreeNode *lChild;
    TreeNode *rChild;
    Type data;
};

template <class Type>
class BSTree{
public:
    BSTree(){
        tree=NULL;
    }
    ~BSTree(){
        delete tree;
    }
    TreeNode<Type>* Search(Type x);
    TreeNode<Type>* ISearch(Type x);
    void Insert(Type x);
    void Delete(Type x);
    void InOrder();        //中序遍历
    void PreOrder();       //先序遍历
    void PostOrder();      //后序遍历 (等价于先搜索右时的先序的反序)
private:
    TreeNode<Type> *tree;
    TreeNode<Type>* Search(TreeNode<Type> *t,Type x);
    void Delete(TreeNode<Type> *t,Type x);
    void Visit(TreeNode<Type> *t);
    void InOrder(TreeNode<Type> *t);
    void PreOrder(TreeNode<Type> *t);
    void PostOrder(TreeNode<Type> *t);
};
template <typename Type>
TreeNode<Type>* BSTree<Type>::Search(Type x){
    return Search(tree,x);
}
template <typename Type>
TreeNode<Type>* BSTree<Type>::Search(TreeNode<Type> *t,Type x){
    bool found=false;
    while(t&&!found){
        if(x==t->data){
            found=true;
        }
        else if(x<t->data){
            t=t->lChild;
        }
        else{
            t=t->rChild;
        }
    }
    if(found){
        return t;
    }
    else{
        return NULL;
    }
}

template <typename Type>
void BSTree<Type>::Visit(TreeNode<Type> *t){
    cout<<t->data<<‘ ‘;
}

template <typename Type>
void BSTree<Type>::Insert(Type x){
    bool found=false;
    TreeNode<Type> *p=tree,*q; //q是p的父节点
    while((p)&&(!found)){
        q=p;          //保证了p接下来往下走
        if(x==p->data){
            found=true;
        }
        else if(x<p->data){
            p=p->lChild;
        }
        else{
            p=p->rChild;
        }
    }
    if(!found){
        p=new TreeNode<Type>;
        p->lChild=p->rChild=NULL;
        p->data=x;
        if(tree){
            if(x<q->data){
                q->lChild=p;
            }
            else{
                q->rChild=p;
            }
        }
        else{
            tree=p;
        }
    }
}

template <typename Type>
void BSTree<Type>::Delete(Type x){
    Delete(tree,x);
}

template <typename Type>
void BSTree<Type>::Delete(TreeNode<Type> *t,Type x){
    bool found=false;
    TreeNode<Type> *p=t,*q;
    while((p)&&(!found)){
        if(x==p->data){
            found=true;
            break;
        }
        q=p;
        if(x<p->data){
            p=p->lChild;
        }
        else{
            p=p->rChild;
        }
    }
    if(found){         //用指针的引用可以节省代码量?
            if(p->lChild==NULL&&p->rChild==NULL){  //删除叶子
                if(x<=q->data){
                    q->lChild=NULL;
                }
                else{
                    q->rChild=NULL;
                }
                p=NULL;
            }
            else if(p->lChild==NULL){  //删除只包含右节点的节点
                if(x<=q->data){
                    q->lChild=p->rChild;
                }
                else{
                    q->rChild=p->rChild;
                }
                p=NULL;
            }
            else if(p->rChild==NULL){   //删除只包含左节点的节点
                if(x<=q->data){
                    q->lChild=p->lChild;
                }
                else{
                    q->rChild=p->lChild;
                }
                p=NULL;
            }
            else{                      //迭代删除
                q=p;
                p=p->lChild;
                while(p->rChild){
                    p=p->rChild;
                }
                x=(q->data)=(p->data);
                q=q->lChild;
                Delete(q,x);
            }

    }
}

template <typename Type>
void BSTree<Type>::InOrder(){
    InOrder(tree);
    cout<<endl;
}

template <typename Type>
void BSTree<Type>::PreOrder(){
    PreOrder(tree);
    cout<<endl;
}

template <typename Type>
void BSTree<Type>::PostOrder(){
    PostOrder(tree);
    cout<<endl;
}

template <typename Type>
void BSTree<Type>::InOrder(TreeNode<Type> *t){
    if(t){
        InOrder(t->lChild);
        Visit(t);
        InOrder(t->rChild);
    }
}

template <typename Type>
void BSTree<Type>::PreOrder(TreeNode<Type> *t){
    if(t){
        Visit(t);
        PreOrder(t->lChild);
        PreOrder(t->rChild);
    }
}

template <typename Type>
void BSTree<Type>::PostOrder(TreeNode<Type> *t){
    if(t){
        PostOrder(t->lChild);
        PostOrder(t->rChild);
        Visit(t);
    }
}

int main(){
    BSTree<int> bst1;
    bst1.Insert(80);/*              80          */
    bst1.Insert(90);/*             /  \         */
    bst1.Insert(60);/*            60  90        */
    bst1.Insert(70);/*           /  \           */
    bst1.Insert(20);/*          20  70          */
    bst1.Insert(10);/*         /  \             */
    bst1.Insert(40);/*        10  40            */
    bst1.Insert(30);/*           /  \           */
    bst1.Insert(50);/*          30  50          */
    bst1.InOrder();
    bst1.PreOrder();
    bst1.PostOrder();
    cout<<endl;

    bool s1=bst1.Search(40);cout<<s1<<endl;
    bool s2=bst1.Search(55);cout<<s2<<endl;

    bst1.InOrder();
    bst1.Delete(30);
    bst1.InOrder();
    return 0;
}

时间: 2024-08-16 12:59:58

ACM-数据结构-二叉搜索树(C++实现)的相关文章

数据结构——二叉搜索树、B树、B-树

数据结构——二叉搜索树.B树.B-树 1. 综述 二叉排序树(Binary Sort Tree),又叫二叉查找树(Binary Search Tree),也叫二叉排序树. 二叉搜索树满足以下性质: 1. 若根节点左子树不为空,则左子树上的所有节点均小于根节点: 2. 若根节点右子树不为空,则右子树上的所有节点均大于根节点: 3. 其左右子树也是二叉搜索树(递归定义): 4. 没有键值相等的点. B树就是B-树.B树/B-树英文叫B-Tree,可能被不小心翻译成了B-树.

数据结构-二叉搜索树与双向链表

题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 分析:首先不能创建新的结构,只能在树的前提下进行改变指针的指向.又由于是二叉搜索树,可以通过画图分析可知,二叉搜索树的左子树小于根节点小于右子树,可以发现是个递归过程也是一个中序遍历.所以只需要在中序那块进行指针调整. /* 剑指offer面试题27 */ #include <iostream> using namespace std; struct BinaryTree{

数据结构-二叉搜索树(BST binary search tree)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来表示,每个节点除了key和卫星数据(除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关),还有left.right.parent,分别指向节点的左孩子.右孩子和父节点,如果对应的节点不存在则指向NIL节点(因为最简单的二叉搜索树中的NIL节点里并没有有用的信息,所以在实现的时候简

数据结构 ---- 二叉搜索树

一直对于二叉搜索树(又叫二叉排序树,也叫二叉查找树),没有很好的理解,决定花点时间来学习and总结.. 二叉搜索树也是二叉树的一种.(就像堆也就二叉树的一种一样...) 只不过,二叉搜索树也是有其他要求:对于所有的子树,其根节点的值大于左子树上的所有结点的值,而小于右子树上所有结点的值的值.. 对于错误的理解:对于所有的结点,要大于其左结点,小于其右结点..(PS:这种理解是错误的,一定要注意..) 还有一点需要注意的是:我们的大于和小于都应该是严格的. ========== 下面主要针对,其建

数据结构-二叉搜索树的js实现

一.树的相关概念 1.基本概念 子树 一个子树由一个节点和它的后代构成. 节点的度 节点所拥有的子树的个数. 树的度 树中各节点度的最大值 节点的深度 节点的深度等于祖先节点的数量 树的高度 树的高度等于所有节点深度的最大值 森林 若干课互不相交的树的集合.任何一棵树,删去根节点就变成了森林. 2. 二叉树 二叉树的定义 (1)二叉树中每个节点的度不大于2 (2)二叉树是有序的,其子树有左右之分,其次序不能随意颠倒 二叉树的性质 第k层上最多有2^(k-1)个节点 深度为k的二叉树最多有2^(k

[数据结构]二叉搜索树(BST) VS 平衡二叉排序树(AVL) VS B树(平衡多路搜索树) VS B+树 VS 红黑树(平衡二叉B树)

1 二叉排序树/二叉查找树/Binary Sort Tree 1种对排序和查找都很有用的特殊二叉树 叉排序树的弊端的解决方案:平衡二叉树 二叉排序树必须满足的3条性质(或是具有如下特征的二叉树) 若它的左子树不为空,则:左子树上所有结点的值< 它根结点的值 若它的右子树不为空,则:右子树上所有结点的值 > 它根结点的值 它的左子树.右子树也分别为二叉排序树(递归性) (按照如上定义,即: 1 无键值相等的结点 2 中序遍历一颗二叉树时,可得一个结点值递增的有序序列) 2 平衡二叉排序树/Bal

算法导论 第三部分——基本数据结构——二叉搜索树

一.什么是二叉搜索树 二叉查找树是按照二叉树结构来组织的,因此可以用二叉链表结构表示.二叉查找树中的关键字的存储方式满足的特征是:设x为二叉查找树中的一个结点.如果y是x的左子树中的一个结点,则key[y]≤key[x].如果y是x的右子树中的一个结点,则key[x]≤key[y].根据二叉查找树的特征可知,采用中根遍历一棵二叉查找树,可以得到树中关键字有小到大的序列. 二叉树的查找.最大/小.前驱和后继的伪代码: 复杂度都是 h //search 递归版 TREE_SEARCH(x,k) if

Java数据结构——二叉搜索树

定义二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 性质1,任意节点x,其左子树中的key不大于x.key,其右子树中的key不小于x.key.2,不同的二叉搜索树可以代表同一组值的集合.3,二叉搜索树的基本操作和树的高度成正比,所以如果是一棵完全二叉树

数据结构-二叉搜索树(Binary Search Tree)的C++实现模板

笔者最近开始学习了二叉树这种数据结构,于是写出了一个二叉树的实现~ 二叉树真是个好东西 =.= 该图显示了在二叉树中插入一个节点的步骤...下面就用这个二叉树做测试好了 /** "BST.h"  * The Binary Search Tree Data Structure in C++  * Time Cost : Inorder / Preorder / Postorder Traversal : O(n)  *             Search / Find / Insert

Java数据结构之二叉搜索树

Java数据结构之二叉搜索树 1.二叉搜索树组成 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是一颗具有如下特性的非空二叉树,需要满足一下三个条件: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非空,则右子树上所有结点的关键字均大于(可以等于)根结点的关键字. (3)左子树右子树本身又各是一颗二叉搜索树 在算法描述中,均以结点值的比较来代表其关键字的比较,因为若结点的值为类类型时,该类必须实现系统提供的java.lang.comparable