Tree2List二叉树转双向链表的实现

这道微软面试题是我在多年以前参加微软面试的时侯被问到的,当时没有做出来。这些天在关注http://v_july_v.的博客中微软面试一百题,想再重新都做一遍。


问题描述:Tree2List二叉树转双向链表

解决方案:很显然是一道考察递归的问题,那么既然要递归一颗二叉树,无非也就常用的先序,中序和后序遍历。现在看来我觉得用哪一种遍历都可以实现。

                    下面我就以中序遍历为基础描述一下解决的思路,借助一个辅助的数据结构来保存头尾指针。在一个子树的遍历过程修改这个辅助的数据结构,同助修改二叉树将父子结点之间的指向关系(代码如下)。有不合适的地方,希望大家指正,多谢!


typedef struct AutNode

{
   BSTreeNode *head;
   BSTreeNode *tail;
   AutNode():head(NULL),tail(NULL){}
}HelpNode;

 HelpNode global;

HelpNode MyTree2List(BSTreeNode * root)
{
   
    if (root==NULL)
    {
        HelpNode temp;
        return temp;
    }
    
    HelpNode ltemp = MyTree2List(root->m_pLeft);
    if(ltemp.head==NULL)
    {
    ltemp.head=root;    
    }
    if(ltemp.tail==NULL)
    {
    ltemp.tail=root;
    }
    else
    {
    ltemp.tail->m_pRight=root;
    root->m_pLeft=ltemp.tail;
    ltemp.tail=root;
    }
    
    
    HelpNode rtemp = MyTree2List(root->m_pRight);
    if(rtemp.tail==NULL)
    {
    rtemp.tail=root;
    }
    if(rtemp.head==NULL)
    {
    rtemp.head=root;
    }
    else
    {
    rtemp.head->m_pLeft=root;
    root->m_pRight=rtemp.head;
    rtemp.head=root;
    }
    
    global.head=ltemp.head;
    global.tail=rtemp.tail;
    
    if(global.head!=NULL && global.tail!=NULL)
    cout<<"value of global is:"<<global.head->m_nValue<<", "<<global.tail->m_nValue<<endl;
    return global;

}




// 后序遍历, 记着修改函数返回值,头尾结点的left 和right分别置NULL;

 HelpNode MyTree2List2(BSTreeNode * root)
 {
    if (root==NULL)
    {
        HelpNode temp;
        return temp;
    }
    HelpNode global2;
    HelpNode ltemp = MyTree2List2(root->m_pLeft);


    HelpNode rtemp = MyTree2List2(root->m_pRight);

    if((ltemp.tail==NULL) && (rtemp.head==NULL))
    {
       global2.head=root;
       global2.tail=root;
    }
    else if ((ltemp.tail!=NULL) && (rtemp.head!=NULL))
    {
        ltemp.tail->m_pRight=rtemp.head;
        rtemp.head->m_pLeft=ltemp.tail;
        rtemp.tail->m_pRight=root;
        root->m_pLeft=rtemp.tail;

        global2.head=ltemp.head;
        global2.tail=root;
    }
    else if (ltemp.tail==NULL && rtemp.head!=NULL)
    {
        rtemp.tail->m_pRight=root;
        root->m_pLeft=rtemp.tail;
        rtemp.tail=root;
        global2.head=rtemp.head;
        global2.tail=root;
    }
    else if(ltemp.tail!=NULL && rtemp.head==NULL)
    {
        ltemp.tail->m_pRight=root;
        root->m_pLeft=ltemp.tail;
        global2.head=ltemp.head;
        global2.tail=root;
    }

    return global2;
 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值