要求:输入一棵二叉排序树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点,只能调整树中结点的指针的指向。如下图:
方法一:我们借助一个容器来顺序存储结点的指针,然后改变指针的指向。
1 //////////////////////二叉搜索树与双向链表(方法一)//////////////////////////////////////////
2
3 void Convertfirst(BinaryTreeNode* pRoot , vector<BinaryTreeNode*>& Vec)
4 {
5 if (pRoot)
6 {
7 Convertfirst(pRoot->m_pLeft , Vec);
8 Vec.push_back(pRoot);
9 Convertfirst(pRoot->m_pRight , Vec);
10 }
11 }
12 BinaryTreeNode* Convert1(BinaryTreeNode* pRoot)
13 {
14 if (!pRoot)
15 {
16 return NULL;
17 }
18 vector<BinaryTreeNode*> Vec ;
19 Convertfirst(pRoot ,Vec);
20 BinaryTreeNode* pHead = Vec[0];
21 vector<BinaryTreeNode*>::iterator it = Vec.begin();
22 for ( ; it != Vec.end()-1;it++)
23 {
24 (*it)->m_pRight = (*(it+1)) ;
25 (*(it+1))->m_pLeft = (*it) ;
26 }
27
28 return pHead ;
29 }
方法二:我们边遍历边改变指针的指向。
1 //////////////////////二叉搜索树与双向链表(方法二)//////////////////
2 void ConvertNode(BinaryTreeNode* pNode , BinaryTreeNode** pLastNodeList)
3 {
4 if (pNode)
5 {
6 ConvertNode(pNode->m_pLeft , pLastNodeList);
7 pNode->m_pLeft = *pLastNodeList;
8 if (*pLastNodeList != NULL)
9 {
10 (*pLastNodeList)->m_pRight = pNode ;
11 }
12 *pLastNodeList = pNode ;
13 ConvertNode(pNode->m_pRight , pLastNodeList);
14 }
15 }
16
17 BinaryTreeNode* Convert2(BinaryTreeNode* pRoot)
18 {
19 if (!pRoot)
20 {
21 return NULL;
22 }
23 BinaryTreeNode* pLastNodeList = NULL ;
24 ConvertNode(pRoot ,&pLastNodeList);
25 while (pLastNodeList && pLastNodeList->m_pLeft)
26 {
27 pLastNodeList = pLastNodeList->m_pLeft ;
28 }
29
30 return pLastNodeList;
31 }
时间: 2024-10-12 06:40:15