完全二叉树指向同一层的相邻结点

题目:对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。

答:时间复杂度为O(n),空间复杂度为O(1)。

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct TreeNode 
{
    int m_nValue;
    TreeNode *m_pLeft;
    TreeNode *m_pRight;
    TreeNode *pNext;
};

//假定所创建的二叉树如下图所示
/*
                                             1
                                          /     \
                                         2       3
                                        / \      / \
                                       4   5    6   7
                                      / \  / \  / \
                                     8   9 10 11 12 13
*/
void CreateBitree(TreeNode *&pNode, fstream &fin)
{
    int dat;
    fin>>dat;
    if(dat == 0)
    {
        pNode = NULL;
    }
    else 
    {
        pNode = new TreeNode();
        pNode->m_nValue = dat;
        pNode->m_pLeft = NULL;
        pNode->m_pRight = NULL;
        pNode->pNext = NULL;
        CreateBitree(pNode->m_pLeft, fin);      
        CreateBitree(pNode->m_pRight, fin); 
    }
}

//完全二叉树指向同一层的相邻结点
void Solution(TreeNode *pHead)
{
    if (NULL == pHead)
    {
        return;
    }
    vector<TreeNode*> vec;
    vec.push_back(pHead);
    TreeNode *pre = NULL;
    TreeNode *pNode = NULL;
    int cur = 0;
    int last = 0;
    while(cur < vec.size())
    {
        last = vec.size();
        while (cur < last)
        {
            if (NULL == pre)
            {
                pre = vec[cur];
            }
            else
            {
                pre->pNext = vec[cur];
            }
            if (NULL != vec[cur]->m_pLeft)
            {
                vec.push_back(vec[cur]->m_pLeft);
            }
            if (NULL != vec[cur]->m_pRight)
            {
                vec.push_back(vec[cur]->m_pRight);
            }
            pre = vec[cur];
            cur++;
        }
        pre->pNext = NULL;
        pre = NULL;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    fstream fin("tree.txt");
    TreeNode *pHead = NULL;
    TreeNode *pNode = NULL;
    CreateBitree(pHead, fin);
    Solution(pHead);

    while (NULL != pHead)
    {
        cout<<pHead->m_nValue<<"  ";
        pNode = pHead->pNext;
        while (NULL != pNode)
        {
            cout<<pNode->m_nValue<<"  ";
            pNode = pNode->pNext;
        }
        cout<<endl;
        pHead = pHead->m_pLeft;
    }

    cout<<endl;
    return 0;
}

运行界面如下:

建造二叉树用到的tree.txt文件如下:

1 2 4 8 0 0 9 0 0 5 10 0 0 11 0 0 3 6 12 0 0 13 0 0 7 0 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值