没有合适的资源?快使用搜索试试~ 我知道了~
首页程序员面试宝典:二叉查找树转排序链表详解
程序员面试宝典:二叉查找树转排序链表详解
需积分: 0 3 下载量 3 浏览量
更新于2024-07-27
收藏 375KB DOC 举报
"面试宝典全集"是一份针对程序员求职者的实用指南,重点在于提供有效的面试准备策略和精选的技术类面试题目。面对日益激烈的就业市场,应届毕业生在求职过程中需经历多个环节,其中面试作为关键环节,它直接展示了求职者的技术实力和能力。面经作为一种备考资源,可以帮助应聘者更好地理解面试流程和常见的技术问题。 本文作者分享了个人在求职过程中的经验,强调了面经的重要性,并提到自己花费大量时间整理了网络上的程序员面试面经,特别是关注了技术类面试题。作者指出,尽管自己水平有限,但提供了两种递归方法来解决经典问题——将二元查找树转换成排序的双向链表,这通常在微软面试中出现。第一种方法是采用分治策略,先处理左右子树,确保子链表有序后再链接;第二种方法则是中序遍历,每次将当前节点插入已排序链表的末尾。 文章中的参考代码定义了一个二元查找树节点的数据结构,为理解如何实现这一转换提供了基础。然而,读者需要注意的是,虽然代码是解决问题的基础,但仍可能存在改进的空间,鼓励读者提出反馈和分享更多高质量的面试题目。 这份“面试宝典全集”旨在帮助求职者掌握核心面试技巧,提升技术面试的表现,以便在竞争激烈的就业市场中脱颖而出。通过阅读和实践这些精选题目,求职者可以增强自信心,提高应对实际面试挑战的能力。
资源详情
资源推荐
std::cout<<*iter<<'\t';
std::cout<<std::endl;
}
// if the node is not a leaf, goto its children
if(pTreeNode->m_pLeft)
FindPath(pTreeNode->m_pLeft, expectedSum, path, currentSum);
if(pTreeNode->m_pRight)
FindPath(pTreeNode->m_pRight, expectedSum, path, currentSum);
// when we finish visiting a node and return to its parent node,
// we should delete this node from the path and
// minus the node's value from the current sum
currentSum -= pTreeNode->m_nValue; //!!I think here is no use
path.pop_back();
}
(05)查找最小的 k 个元素
题目:输入 n 个整数,输出其中最小的 k 个。
例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4。
分析:这道题最简单的思路莫过于把输入的 n 个整数排序,这样排在最前面的 k 个数就是
最小的 k 个数。只是这种思路的时间复杂度为 O(nlogn)。我们试着寻找更快的解决思路。
我们可以开辟一个长度为 k 的数组。每次从输入的 n 个整数中读入一个数。如果数组中已
经插入的元素少于 k 个,则将读入的整数直接放到数组中。否则长度为 k 的数组已经满了,
不能再往数组里插入元素,只能替换了。如果读入的这个整数比数组中已有 k 个整数的最
大值要小,则用读入的这个整数替换这个最大值;如果读入的整数比数组中已有 k 个整数
的最大值还要大,则读入的这个整数不可能是最小的 k 个整数之一,抛弃这个整数。这种
思路相当于只要排序 k 个整数,因此时间复杂可以降到 O(n+nlogk)。通常情况下 k 要远小
于 n,所以这种办法要优于前面的思路。
这是我能够想出来的最快的解决方案。不过从给面试官留下更好印象的角度出发,我们可
以进一步把代码写得更漂亮一些。从上面的分析,当长度为 k 的数组已经满了之后,如果
需要替换,每次替换的都是数组中的最大值。在常用的数据结构中,能够在 O(1)时间里得
到最大值的数据结构为最大堆。因此我们可以用堆(heap)来代替数组。
另外,自己重头开始写一个最大堆需要一定量的代码。我们现在不需要重新去发明车轮,
因为前人早就发明出来了。同样,STL 中的 set 和 multiset 为我们做了很好的堆的实现,
我们可以拿过来用。既偷了懒,又给面试官留下熟悉 STL 的好印象,何乐而不为之?
参考代码:
#include <set>
#include <vector>
#include <iostream>
11
using namespace std;
typedef multiset<int, greater<int> > IntHeap;
/////////////////////////////////////////////////////////////////////
//
// find k least numbers in a vector
/////////////////////////////////////////////////////////////////////
//
void FindKLeastNumbers
(
const vector<int>& data, // a vector of data
IntHeap& leastNumbers, // k least numbers, output
unsigned int k
)
{
leastNumbers.clear();
if(k == 0 || data.size() < k)
return;
vector<int>::const_iterator iter = data.begin();
for(; iter != data.end(); ++ iter)
{
// if less than k numbers was inserted into leastNumbers
if((leastNumbers.size()) < k)
leastNumbers.insert(*iter);
// leastNumbers contains k numbers and it's full now
else
{
// first number in leastNumbers is the greatest one
IntHeap::iterator iterFirst = leastNumbers.begin();
// if is less than the previous greatest number
if(*iter < *(leastNumbers.begin()))
{
// replace the previous greatest number
leastNumbers.erase(iterFirst);
leastNumbers.insert(*iter);
}
}
}
12
}
(06)判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返
回 true,否则返回 false。
例如输入 5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回 true。
如果输入 7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false。
分析:这是一道 trilogy 的笔试题,主要考查对二元查找树的理解。
在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结
点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元
素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据这样的
划分,把序列划分为左右两部分,我们递归地确认序列的左、右两部分是不是都是二元查
找树。
参考代码:
using namespace std;
/////////////////////////////////////////////////////////////////////
//
// Verify whether a squence of integers are the post order traversal
// of a binary search tree (BST)
// Input: squence - the squence of integers
// length - the length of squence
// Return: return ture if the squence is traversal result of a BST,
// otherwise, return false
/////////////////////////////////////////////////////////////////////
//
bool verifySquenceOfBST(int squence[], int length)
{
if(squence == NULL || length <= 0)
return false;
// root of a BST is at the end of post order traversal squence
int root = squence[length - 1];
13
剩余63页未读,继续阅读
tianxia_03
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 构建Cadence PSpice仿真模型库教程
- VMware 10.0安装指南:步骤详解与网络、文件共享解决方案
- 中国互联网20周年必读:影响行业的100本经典书籍
- SQL Server 2000 Analysis Services的经典MDX查询示例
- VC6.0 MFC操作Excel教程:亲测Win7下的应用与保存技巧
- 使用Python NetworkX处理网络图
- 科技驱动:计算机控制技术的革新与应用
- MF-1型机器人硬件与robobasic编程详解
- ADC性能指标解析:超越位数、SNR和谐波
- 通用示波器改造为逻辑分析仪:0-1字符显示与电路设计
- C++实现TCP控制台客户端
- SOA架构下ESB在卷烟厂的信息整合与决策支持
- 三维人脸识别:技术进展与应用解析
- 单张人脸图像的眼镜边框自动去除方法
- C语言绘制图形:余弦曲线与正弦函数示例
- Matlab 文件操作入门:fopen、fclose、fprintf、fscanf 等函数使用详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功