利用二叉搜索树来实现排序 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;
}

 


二叉搜索树的Insert、Find、FindMin、FindMax、Delete、MakeEmpty

searchTree.h 功能实现 /*============================================== 二叉查找树(BSTree)的Insert、Find、FindMin...
  • quzhongxin
  • quzhongxin
  • 2015年01月17日 16:52
  • 846

PKU OJ 1002(487-3279)电话号码解题方法与个人最简短代码

以前一次偶然的机会听说了最短代码竞赛,这两天不想干啥事,便开始做一做OJ吧, 题目见这里:http://poj.org/problem?id=1002 主要是一个字符串读取与转换,我的代码长度为651...
  • luofl1992
  • luofl1992
  • 2013年07月28日 14:16
  • 1066

中序遍历-----二叉查找树的遍历(迭代版,不使用栈或者队列)

二叉查找树(Binary Search Tree)的遍历的方法有很多,通常使用的是递归的遍历,其便于理解,但是使用递归的话会造成程序运行的空间浪费,效率并不高。为此可以使用一个栈来模拟递归的过程,实现...
  • shaya118
  • shaya118
  • 2014年11月25日 11:09
  • 928

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

一:二叉排序树定义 二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 二叉排序树是这样一棵树: (1)若左子树不空,则左子树上所有...
  • FreeeLinux
  • FreeeLinux
  • 2016年08月11日 18:02
  • 627

二叉搜索树BSTree

// Binary_Search_Tree.cpp : Defines the entry point for the console application.//二叉查找树:对于任何结点x,其左子树...
  • yshuise
  • yshuise
  • 2007年01月10日 16:04
  • 1411

北大OJ1002

#include #include using namespace std; char ch[]="22233344455566677778889999"; int compare(const voi...
  • wuqiqi1992
  • wuqiqi1992
  • 2015年12月08日 20:23
  • 473

二叉搜索树实现简单字典

日常生活中我们经常使用字典来查找单词的中文意思,也会根据中文来查找所对应的汉语。前面我们知道二叉树实现可以迅速查找一个数据,而且可以插入和删除。 这里我们可以用搜索二叉树实现简单的字典,查找英文单词...
  • f2016913
  • f2016913
  • 2017年04月04日 09:52
  • 650

北大OJ_1002题:487-3279

#include #include #include using namespace std; int main() { char szNumMap[] = "2223334445556...
  • s634772208
  • s634772208
  • 2015年06月18日 13:27
  • 720

[BSTree] 二叉搜索树 -- C++ 模板实现

以C++模板实现二叉搜索树
  • kewing
  • kewing
  • 2010年09月27日 17:00
  • 944

【转】二叉搜索树BSTree源码

http://www.yuanma.org/data/2006/0912/article_1516.htm  In computer science, a binary search tree (BS...
  • okmnji79513
  • okmnji79513
  • 2009年11月04日 09:19
  • 345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用二叉搜索树来实现排序 BSTree(pku 1002)
举报原因:
原因补充:

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