算法经典p7Word下载.docx
- 文档编号:20263659
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:17
- 大小:23.35KB
算法经典p7Word下载.docx
《算法经典p7Word下载.docx》由会员分享,可在线阅读,更多相关《算法经典p7Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
//
a
node
in
the
binary
search
tree
{
int
m_nValue;
value
of
node
*m_pLeft;
left
child
*m_pRight;
right
};
思路一对应的代码:
///////////////////////////////////////////////////////////////////////
Covert
sub
binary-search-tree
into
sorted
double-linked
list
Input:
pNode
-
head
asRight
whether
is
its
parent
Output:
if
true,
return
least
sub-tree
else
greatest
BSTreeNode*
ConvertNode(BSTreeNode*
pNode,
bool
asRight)
if(!
pNode)
NULL;
*pLeft
=
*pRight
Convert
if(pNode->
m_pLeft)
pLeft
ConvertNode(pNode->
m_pLeft,
false);
Connect
sub-tree
to
current
if(pLeft)
pLeft->
m_pRight
pNode;
pNode->
m_pLeft
pLeft;
}
m_pRight)
pRight
m_pRight,
true);
if(pRight)
pRight;
pRight->
*pTemp
If
parent,
tree
whose
root
if(asRight)
while(pTemp->
pTemp
pTemp->
m_pLeft;
else
m_pRight;
pTemp;
Convert(BSTreeNode*
pHeadOfTree)
As
we
want
list,
set
second
parameter
be
true
ConvertNode(pHeadOfTree,
思路二对应的代码:
pLastNodeInList
tail
void
BSTreeNode*&
pLastNodeInList)
if(pNode
==
NULL)
return;
*pCurrent
(pCurrent->
!
ConvertNode(pCurrent->
pLastNodeInList);
Put
pCurrent->
pLastNodeInList;
if(pLastNodeInList
pLastNodeInList->
pCurrent;
pHeadOfTree
Convert_Solution1(BSTreeNode*
*pLastNodeInList
Get
*pHeadOfList
while(pHeadOfList
&
pHeadOfList->
pHeadOfList
pHeadOfList;
}
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O
(1)。
分析:
这是去年google的一道面试题。
我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。
这样栈顶元素将是最小元素。
但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。
每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。
乍一看这样思路挺好的。
但仔细一想,该思路存在一个重要的问题:
如果当前最小元素被pop出去,如何才能得到下一个最小元素?
因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。
我们需要一个辅助栈。
每次push一个新元素的时候,同时将最小元素(或最小元素的位置。
考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;
每次pop一个元素出栈的时候,同时pop辅助栈。
#include
<
deque>
assert.h>
template
typename
T>
class
CStackWithMin
public:
CStackWithMin(void)
{}
virtual
~CStackWithMin(void)
T&
top(void);
const
top(void)
const;
push(const
value);
pop(void);
min(void)
private:
m_data;
elements
stack
size_t>
m_minIndex;
indices
minimum
elements
get
last
element
mutable
CStackWithMin<
:
top()
m_data.back();
non-mutable
top()
const
insert
an
elment
at
end
value)
append
data
m_data
m_data.push_back(value);
index
m_data
m_minIndex
if(m_minIndex.size()
0)
m_minIndex.push_back(0);
if(value
m_data[m_minIndex.back()])
m_minIndex.push_back(m_data.size()
1);
m_minIndex.push_back(m_minIndex.back());
erease
pop()
pop
m_data.pop_back();
m_minIndex.pop_back();
min()
assert(m_data.size()
>
0);
assert(m_minIndex.size()
m_data[m_minIndex.back()];
举个例子演示上述代码的运行过程:
步骤
数据栈
辅助栈
最小值
1.push
3
0
3
2.push
4
3,4
0,0
3.push
2
3,4,2
0,0,2
2
4.push
1
3,4,2,1
0,0,2,3
1
5.pop
6.pop
7.push
3,4,0
讨论:
如果思路正确,编写上述代码不是一件很难的事情。
但如果能注意一些细节无疑能在面试中加分。
比如我在上面的代码中做了如下的工作:
·
用模板类实现。
如果别人的元素类型只是int类型,模板将能给面试官带来好印象;
两个版本的top函数。
在很多类中,都需要提供const和非const版本的成员访问函数;
min函数中assert。
把代码写的尽量安全是每个软件公司对程序员的要求;
添加一些注释。
注释既能提高代码的可读性,又能增加代码量,何乐而不为?
总之,在面试时如果时间允许,尽量把代码写的漂亮一些。
说不定代码中的几个小亮点就能让自己轻松拿到心仪的
输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
5
12
7
则打印出两条路径:
10,
12和10,
5,
7。
二元树结点的数据结构定义为:
BinaryTreeNode
这是XX的一道笔试题,考查对树这种基本数据结构以及递归函数的理解。
当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。
如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。
如果当前结点不是叶结点,则继续访问它的子结点。
当前结点访问结束后,递归函数将自动回到父结点。
因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。
我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过程。
Find
paths
sum
equal
expected
sum
FindPath
(
BinaryTreeNode*
pTreeNode,
expectedSum,
std:
vector<
int>
path,
path
from
int&
currentSum
path
)
pTreeNode)
+=
pTreeNode->
path.push_back(pTreeNode->
m_nValue);
leaf,
and
same
as
pre-defined,
what
want.
isLeaf
(!
m_pRight);
if(currentSum
expectedSum
isLeaf)
{
iterator
iter
path.begin();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 经典 p7