这道微软面试题是我在多年以前参加微软面试的时侯被问到的,当时没有做出来。这些天在关注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;
}