题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:二叉搜索树左小右大,中序遍历。当前结点左结点连接左子树最大值,左子树最大值右结点连接当前节点,以当前结点为最大值,以右子树和最大值递归。
#include <iostream>
using namespace std;
struct BinaryTreeNode {
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
};
void Transform(BinaryTreeNode *root, BinaryTreeNode **pLastNodeInList) {
if (root != NULL) {
BinaryTreeNode *pCur = root;
if (pCur->m_pLeft != NULL)
Transform(pCur->m_pLeft, pLastNodeInList);
pCur->m_pLeft = *pLastNodeInList;
if (*pLastNodeInList != NULL)
(*pLastNodeInList)->m_pRight = pCur;
*pLastNodeInList = pCur;
if (pCur->m_pRight != NULL)
Transform(pCur->m_pRight, pLastNodeInList);
}
}
BinaryTreeNode *Convert(BinaryTreeNode *pRoot) {
BinaryTreeNode *pLastNodeInList = NULL;
Transform(pRoot, &pLastNodeInList);
BinaryTreeNode *pHead = pLastNodeInList;
while (pLastNodeInList != NULL && pHead->m_pLeft != NULL)
pHead = pHead->m_pLeft;
return pHead;
}
BinaryTreeNode *Create() {
int a;
cin >> a;
if (a != -1) {
BinaryTreeNode *phead = new BinaryTreeNode;
phead->m_nValue = a;
cout << a << "左" << endl;
phead->m_pLeft = Create();
cout << a << "右" << endl;
phead->m_pRight = Create();
return phead;
}
return NULL;
}
int main() {
BinaryTreeNode *head = Cr
----------
----------
eate();
head = Convert(head);
BinaryTreeNode *node = head;
while (node != NULL) {
cout << node->m_nValue << " ";
node = node->m_pRight;
}
cout << endl;
return 0;
}