您的位置:首页 > 职场人生

笔试面试之将2叉查找树转换为双向链表

2010-06-18 21:09 302 查看
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。

比如将二元查找树

10
/
/
6
14
/ / / 
/

 4 8 12 16
转换成双向链表

4=6=8=10=12=14=16。

  分析:本题是微软的面试题。很多与树相关的题目都是用递归的思路来解决,本题也不例外。下面我们用两种不同的递归思路来分析。

  思路一:当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最近链接左子链表的最右结点(左子树的最大结点)、当前结点和右子链表的最左结点(右子树的最小结点)。从树的根结点开始递归调整所有结点。

BSTreeNode*
Convert(BSTreeNode* pHeadOfTree)
{
// As we want
to return the head of the sorted double-linked list,
// we set the
second parameter to be true
return
ConvertNode(pHeadOfTree, true);
}

void ConvertNode(BSTreeNode*
pNode, BSTreeNode*& pLastNodeInList)
{
if(pNode
== NULL)
return;

BSTreeNode *pCurrent =
pNode;

// Convert the
left sub-tree
if
(pCurrent->m_pLeft != NULL)
ConvertNode(pCurrent->m_pLeft,
pLastNodeInList);

// Put the
current node into the double-linked list
pCurrent->m_pLeft =
pLastNodeInList;
if(pLastNodeInList != NULL)
pLastNodeInList->m_pRight =
pCurrent;

pLastNodeInList =
pCurrent;

// Convert the
right sub-tree
if
(pCurrent->m_pRight != NULL)
ConvertNode(pCurrent->m_pRight,
pLastNodeInList);
}

BSTreeNode*
Convert_Solution1(BSTreeNode* pHeadOfTree)
{
BSTreeNode *pLastNodeInList =
NULL;
ConvertNode(pHeadOfTree,
pLastNodeInList);

// Get the head
of the double-linked list
BSTreeNode *pHeadOfList =
pLastNodeInList;
while(pHeadOfList &&
pHeadOfList->m_pLeft)
pHeadOfList =
pHeadOfList->m_pLeft;

return
pHeadOfList;
}

转载自:http://zhedahht.blog.163.com/blog/static/254111742007127104759245/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: