首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

1. 二元查寻树转变成排序的双向链表

2012-12-18 
1. 二元查找树转变成排序的双向链表1.把二元查找树转变成排序的双向链表?题目:输入一棵二元查找树,将该二

1. 二元查找树转变成排序的双向链表

1.把二元查找树转变成排序的双向链表
?题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
????? 10
???? /??? \
??? 6??? 14
? ?/ \??? / \
? 4 8 12 16

?

转换成双向链表
4=6=8=10=12=14=16

?

首先我们定义的二元查找树 节点的数据结构如下:

 struct BSTreeNode{     int m_nValue;                     // value of node     BSTreeNode   *m_pLeft;      // left child of node     BSTreeNode   *m_pRight;    // right child of node};

?

?

题目分析:?

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

?

思路一对应的代码:

BSTreeNode* ConvertNode(BSTreeNode* pNode, bool asRight){  if(!pNode)  return NULL;  BSTreeNode *pLeft = NULL;  BSTreeNode *pRight = NULL;  // Convert the left sub-tree  if(pNode->m_pLeft)  pLeft = ConvertNode(pNode->m_pLeft, false);  // Connect the greatest node in the left sub-tree to the current node  if(pLeft)  {  pLeft->m_pRight = pNode;  pNode->m_pLeft = pLeft;  }  // Convert the right sub-tree  if(pNode->m_pRight)  pRight = ConvertNode(pNode->m_pRight, true);  // Connect the least node in the right sub-tree to the current node  if(pRight)  {  pNode->m_pRight = pRight;  pRight->m_pLeft = pNode;  }  BSTreeNode *pTemp = pNode;  // If the current node is the right child of its parent,    // return the least node in the tree whose root is the current node  if(asRight)  {  while(pTemp->m_pLeft)  pTemp = pTemp->m_pLeft;  }  // If the current node is the left child of its parent,    // return the greatest node in the tree whose root is the current node  else  {  while(pTemp->m_pRight)  pTemp = pTemp->m_pRight;  }  return pTemp;} 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);}///////////////////////////////////////////////////////////////////////// Covert a binary search tree into a sorted double-linked list// Input: pHeadOfTree - the head of tree// Output: the head of sorted double-linked list///////////////////////////////////////////////////////////////////////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;}

?


?

热点排行