利用二叉搜索树来实现排序 BSTree(pku 1002)

原创 2007年10月08日 10:07:00

来自:http://blog.csdn.net/benny5609/category/334908.aspx 

#include <iostream>

using namespace std;

int flag;

class tNode{
    public:
        tNode();
        tNode(int value);
        int val;
        int counts;
        tNode * lch, * rch;
};
tNode::tNode(){
    val = 0;
    counts = 0;
    lch = rch = NULL;
}
tNode::tNode(int value) {
    val = value;
    counts = 1;
    lch = rch = NULL;
}

class BSTree{
    public:
        BSTree();
        tNode * insert(tNode *);
        void mfs(tNode *);
        tNode * root;
};
BSTree::BSTree(){
    root = NULL;
}
tNode * BSTree::insert(tNode * z) {  //寻找合适的位置来插入
    tNode * y = NULL;
    tNode * x = root;
    while (x!=NULL) {   //寻找合适的插入位置
        y = x;
        if (z->val == x->val) {  //与要插入的元素值相同的元素已经存在
            ++x->counts;
            break;
        } else if (z->val < x->val) {
            x = x->lch;
        } else {
            x = x->rch;
        }
    }
    if (NULL==x) {
        if (NULL==y) root = z;  //之前是一棵空的树
        else {    //插在已经找到的合适的位置
            if (z->val < y->val)
                y->lch = z;
            else
                y->rch = z;
        }
    }
    return z;
}

void BSTree::mfs(tNode * tn) { //具有排序的功能。从二叉树的最左边开始递归遍历整棵树
    if (NULL==tn) return;
    mfs(tn->lch);
    if (tn->counts>1)
 {
        if (!flag)
   flag = 1;
        cout.width(3);
        cout<<tn->val/10000;
        cout<<"-";
        cout.width(4);
        cout<<tn->val%10000;
        cout<<" "<<tn->counts<<endl;
    }
    mfs(tn->rch);
}


int main(){
    int i,N,val;
    char c;
    BSTree * bst = new BSTree();
    flag = 0;
    cin>>N;
    c = cin.get(); // remove '/n'
    for (i=0;i<N;++i) {
        // input
        val = 0;
        while ((c=cin.get())!='/n'){
            if (c>='0' && c<='9')
                val=val*10+c-'0';
            else if (c>='A' && c<'Q')
                val=val*10+(c-'A')/3+2;
            else if (c>'Q' && c<'Z')
                val=val*10+(c-'Q')/3+7;
        }
        bst->insert(new tNode(val));
        // solve
    }
    cout.fill('0');
    bst->mfs(bst->root);
    if (!flag) cout<<"No duplicates. ";
    delete bst;
    return 0;
}

 


【BSTree】深入理解二叉搜索树

一、概念二叉搜索树又称为二叉排序树,主要满足以下性质的二叉树则成为二叉搜索树: 若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。 若它的右子树不为空,则右子树上所有结点的值都大于根结点的值...
  • ArchyLi
  • ArchyLi
  • 2017年11月02日 17:47
  • 558

二叉搜索树ADT_BSTree

二叉搜索树或是一颗空二叉树, 或是具有以下性质的二叉树: 1.若左子树不为空, 则左子树上所有结点的关键字值均小于根结点的关键字值. 2.若右子树不为空, 则右子树上所有结点的关键字值均大于根结点...

[C++]数据结构:基于二叉树类的二叉搜索树BSTree类的创建与使用

//链表描述二叉树的创建与遍历 #include using namespace std; /**********************************/ /*以下内容是一个队列数据结构的...

C++实现二叉排序树BSTree --插入删除摧毁查找等操作

一:二叉排序树定义 二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 二叉排序树是这样一棵树: (1)若左子树不空,则左子树上所有...

二叉排序树(BSTree)关于查找算法结合

/*基于树的顺序查找法*/ /*二叉排序树的存储结构*/ typedef struct node { KeyType key; /*关键字的值*/ ...
  • Solo95
  • Solo95
  • 2016年05月19日 21:06
  • 382

leetcode 将已排序的 数组/链表 转换为二叉搜索树(BST),Python实现

思路:不论是数组还是链表,递归地找到他的root(即序列的中点),并返回。 1. 将数组转换为二叉树: # Definition for a binary tree node. # class T...

二叉搜索树的根插入、选择、删除、合并、排序等操作的实现

源代码如下: 这里的Key 不当为关键字对待, 而是把Item.c作为关键字对待 #include #include //#define Key int typedef int...

二叉搜索树转换成一个排序的双向链表和实现一个线程安全且高效单例类——题集(二十一)

二叉搜索树转换成一个排序的双向链表和实现一个线程安全且高效单例类——题集(十五)        今天分享一下实现二叉搜索树转换成一个排序的双向链表和用C++实现一个线程安全且高效单例类的源代码和运行示...

二叉搜索树(二叉排序数)的基本操作实现

本文实现了二叉搜索树的插入、查找、删除、求最大节点、最小节点以及直接前驱、直接后继节点的基本操作。 二叉搜索树,二叉查找树,二叉排序树说的都是一个概念。这篇博文中我们称其为二叉搜索树。二叉搜索树指的是...

C++实现二叉搜索树(二叉排序树)模板类

参考了Weiss的数据结构与算法分析C++描述第三版完成二叉搜索树
  • cjbct
  • cjbct
  • 2016年12月09日 21:51
  • 869
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用二叉搜索树来实现排序 BSTree(pku 1002)
举报原因:
原因补充:

(最多只允许输入30个字)