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

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

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

/*基于树的顺序查找法*/ /*二叉排序树的存储结构*/ typedef struct node { KeyType key; /*关键字的值*/ ...

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

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

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

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

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

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

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

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

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

参考了Weiss的数据结构与算法分析C++描述第三版完成二叉搜索树
  • cjbct
  • cjbct
  • 2016-12-09 21:51
  • 600

二叉搜索树(二叉查找树、二叉排序树)及其实现

二叉排序树的定义二叉排序树(Binary Sort Tree),又称二叉查找树、二叉搜索树。它或者是一棵空树;或者是具有下列性质的二叉树: 1. 若左子树不空,则左子树上所有结点的值均小于它的根结点...

c语言实现二叉搜索树

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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