《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及解释。
以下算法采用深度优先搜索解决。该算法的时间复杂度和空间复杂度为
O
(
n
)
O(n)
O(n)。这里的递归算法会递归调用
O
(
log
2
(
n
)
)
O(\log_2(n))
O(log2(n))(平衡树)次(递归深度)。外加存储树中节点的
O
(
n
)
O(n)
O(n)空间,因此深度优先搜索算法的空间复杂度为
O
(
n
+
log
2
(
n
)
)
O(n+\log_2(n))
O(n+log2(n))。因为
n
>
log
2
(
n
)
n>\log_2(n)
n>log2(n),所以
O
(
n
+
log
2
(
n
)
)
O(n+\log_2(n))
O(n+log2(n))
<
<
<
O
(
n
+
n
)
=
O
(
2
∗
n
)
O(n+n)=O(2*n)
O(n+n)=O(2∗n)。又因为大
O
O
O表示运行时间的上界,所以
O
(
2
∗
n
)
O(2*n)
O(2∗n)=
O
(
n
)
O(n)
O(n)。对于时间复杂度,这里的递归调用一共有
log
2
(
n
)
\log_2(n)
log2(n)层,第0层有
2
0
=
1
2^0=1
20=1个函数调用,第1层有
2
1
=
2
2^1=2
21=2个函数调用,第2层有
2
2
=
4
2^2=4
22=4个函数调用,…。因此深度优先搜索算法的时间复杂度为
2
0
+
2
1
+
2
2
+
.
.
.
.
.
.
+
2
log
2
n
2^0+2^1+2^2+......+2^{\log_2n}
20+21+22+......+2log2n
=
=
=
2
(
log
2
n
)
+
1
2^{(\log_2n)+1}
2(log2n)+1
=
=
=
2
∗
2
log
2
n
2*2^{\log_2n}
2∗2log2n
=
=
=
2
∗
n
2*n
2∗n。同上因为大
O
O
O表示运行时间的上界,所以
O
(
2
∗
n
)
O(2*n)
O(2∗n)=
O
(
n
)
O(n)
O(n)。
class BinaryNode
{
private:
int data;
BinaryNode* left;
BinaryNode* right;
public:
BinaryNode(int value = 0, BinaryNode* pointer1 = nullptr, BinaryNode* pointer2 = nullptr)
{
data = value;
left = pointer1;
right = pointer2;
}
BinaryNode* getLeft( )
{
return left;
}
BinaryNode* getRight()
{
return right;
}
};
void createLevelLinkedListHelper(BinaryNode* root, vector<forward_list<BinaryNode>*> & levelLinkedLists,int level)
{
if (root == nullptr)
return;
forward_list<BinaryNode > *list = new forward_list<BinaryNode>();
if (levelLinkedLists.size() == level)
{
levelLinkedLists.push_back(list);
}
else
{
list = levelLinkedLists[level];
}
list->push_front(*root);
createLevelLinkedListHelper(root->getLeft(), levelLinkedLists, level+1);
createLevelLinkedListHelper(root->getRight(), levelLinkedLists, level+1);
}
vector<forward_list<BinaryNode>*> createLevelLinkedList(BinaryNode *root)
{
vector<forward_list<BinaryNode>*> levelLinkedLists = vector<forward_list<BinaryNode>*>();
createLevelLinkedListHelper(root, levelLinkedLists, 0);
return levelLinkedLists;
}
以下算法采用广度优先搜索解决。该算法的时间复杂度和空间复杂度为 O ( n ) O(n) O(n)
vector<forward_list<BinaryNode>*> createLevelLinkedListHelper(BinaryNode* root)
{
vector<forward_list<BinaryNode>*> levelLinkedLists = vector<forward_list<BinaryNode>*>();
if (root == nullptr)
return;
forward_list<BinaryNode > *current = new forward_list<BinaryNode>();
current->push_front(*root);
while (!current->empty())
{
levelLinkedLists.push_back(current);
forward_list<BinaryNode >* parents = current;
current = new forward_list<BinaryNode >();
for (BinaryNode& parent : (*parents))
{
if (parent.getLeft() != nullptr)
{
current->push_front(*parent.getLeft());
}
if (parent.getRight() != nullptr)
{
current->push_front(*parent.getRight());
}
}
}
return levelLinkedLists;
}