读取一串整数,寻找合适的数据结构和算法,实现插入元素track(int x) 方法,以及GetRankOfNumber(int x)方法,返回值为小于等于x的元素个数(不包括x本身)
2014-11-19 11:53
615 查看
题目:《程序员面试金典(第5版)》P267
假如你正在读取一串整数。每隔一段时间,你希望能找出数字的秩(小于或等于x的值得数目,不包括x本身)。请实现数据结构和算法支持这些操作。也就是说,实现track(int x) 方法,每读入一个整数都会调用该方法;以及GetRankOfNumber(int x)方法,返回值为小于等于x的元素个数(不包括x本身)。
提示:采用二叉查找树实现该功能。二叉查找树(Binary Search Tree,BST)是一颗典型的二叉树,任何节点的键值大于等于该节点左子树中的所有键值,小于该节点右子树中的所有键值,并且每个节点域中有一个元素,记录该节点的左子树中所有节点的个数。
二叉查找树的实现如下代码所示:
假如你正在读取一串整数。每隔一段时间,你希望能找出数字的秩(小于或等于x的值得数目,不包括x本身)。请实现数据结构和算法支持这些操作。也就是说,实现track(int x) 方法,每读入一个整数都会调用该方法;以及GetRankOfNumber(int x)方法,返回值为小于等于x的元素个数(不包括x本身)。
提示:采用二叉查找树实现该功能。二叉查找树(Binary Search Tree,BST)是一颗典型的二叉树,任何节点的键值大于等于该节点左子树中的所有键值,小于该节点右子树中的所有键值,并且每个节点域中有一个元素,记录该节点的左子树中所有节点的个数。
二叉查找树的实现如下代码所示:
class RankNode { public: int data; int left_size; RankNode* left,*right; RankNode(int n); //~RankNode();//遍历,全部delete void insert(int n); int GetRank(int d); }; RankNode::RankNode(int n) { data=n; left=nullptr; right=nullptr; left_size=0; } void RankNode::insert(int n) { if(n<=data) { if(left==nullptr) left=new RankNode(n); else left->insert(n); left_size++; } else { if(right==nullptr) right=new RankNode(n); else right->insert(n); } } int RankNode::GetRank(int d) { if(d==data) return left_size; else if(d<data) { if(left==nullptr) return -1; else return left->GetRank(d); } else { if(right==nullptr) return -1; else { int right_rank=right->GetRank(d); if(right_rank==-1) return -1; else return left_size+1+right_rank; } } }则本题目的解法如下:
class Question { public: RankNode *root; Question() { root=nullptr; } //遍历删除整个二叉查找树,避免内存泄露 ~Question() { if(root!=nullptr) { TraversalDelete(root->left); TraversalDelete(root->right); delete root; root=nullptr; } } void track(int x) { if(root==nullptr) root=new RankNode(x); else root->insert(x); } int GetRankOfNumber(int x) { if(root==nullptr) return -1; else return root->GetRank(x); } void TraversalDelete(RankNode * h) { if(h!=nullptr) { TraversalDelete(h->left); TraversalDelete(h->right); delete h; h=nullptr; } } };
相关文章推荐
- c语言:实现对于给定的正整数N,依次打印出小于等于N的所有素数。两种方法及其优化
- 11.8 实现数据结构和算法支持track和rank操作。
- 借鉴快速排序的思想,实现算法将整型数组a[0...n]分成两块,使得第一块元素均大于等于0,第二块的元素均小于0,要求算法原地工作且时间复杂度为O(n)
- 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)
- 数据结构 P38 算法实现 在带头结点的单链表的第i个元素插入元素e
- [ActionScript 3.0] 用TextField的方法getCharIndexAtPoint(x:Number, y:Number):int实现文字在固定范围内显示
- 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)
- 【Java】假设你正在读取一串整数,每隔一段时间,你希望找出数字X的秩(小于或等于x的值的数目)。
- 微软等数据结构+算法面试100题(9)--在一个int 数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
- c语言:实现对于给定的正整数N,依次打印出小于等于N的所有素数。两种方法及其优化
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 从键盘读入n个整数(升序),请编写算法实现: 建立带表头结点的单链表; 显示单链表,(形如:H->10->20->30->40); 在有序单链表中插入新的数据元素x; 将单链表就地逆
- 请实现一个队列,既可以存放整数,又可以存放字符串。简单的说,队列是一种数据结构,按照先进先出的顺序管理进、出队列的元素
- js 获取class的元素的方法 以及创建方法getElementsByClassName
- 寻找最小的k个数(采用维护n个元素的最小堆的方法来实现)
- 算法与数据结构--实现线性表的插入操作--算法2.3
- javascript 三种方法实现获得和设置以及移除元素属性
- C# GetSchema Get List of Table 获取数据库中所有的表名以及表中的纪录条数的方法
- 请实现一个队列,既可以存放整数,又可以存放字符串。简单的说,队列是一种数据结构,按照先进先出的顺序管理进、出队列的元素