4.3 特定深度节点链表

     《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及解释。
     以下算法采用深度优先搜索解决。该算法的时间复杂度和空间复杂度为 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(2n)。又因为大 O O O表示运行时间的上界,所以 O ( 2 ∗ n ) O(2*n) O(2n)= 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} 22log2n = = = 2 ∗ n 2*n 2n。同上因为大 O O O表示运行时间的上界,所以 O ( 2 ∗ n ) O(2*n) O(2n)= 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqssss121dfd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值