由于pTailOfList指针是全局更新的,所以使用二重指针做函数形参。
#include<iostream>
using namespace std;
struct TreeNode {
int value;
TreeNode*left;
TreeNode*right;
TreeNode(int x = 0) :value(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode*Convert(TreeNode*proot) {
if (proot == NULL)
return NULL;
TreeNode*pTailOfList = NULL;//双向链表的尾结点初始化
//开始转换结点
ConvertCore(proot, &pTailOfList);
//完成转换后寻找链表的头结点
TreeNode*pHeadOfList = pTailOfList;
while (pHeadOfList != NULL&&pHeadOfList->left != NULL)
pHeadOfList = pHeadOfList->left;
return pHeadOfList;
}
private:
//中序遍历
void ConvertCore(TreeNode*pnode, TreeNode**pTailOfList) {
TreeNode*pcurrent = pnode;//每个子递归都要记录当前结点
//递归左子树
if (pcurrent->left != NULL)
ConvertCore(pcurrent->left, pTailOfList);
//开始双向连接
pcurrent->left = *pTailOfList;
if (*pTailOfList != NULL)
(*pTailOfList)->right = pcurrent;
//更新双向链表的尾结点
*pTailOfList = pcurrent;
//递归右子树
if (pcurrent->right != NULL)
ConvertCore(pcurrent->right, pTailOfList);
}
};
int main(void) {
TreeNode*root = new TreeNode(10);
TreeNode*node1 = new TreeNode(6); TreeNode*node2 = new TreeNode(14);
TreeNode*node3 = new TreeNode(4); TreeNode*node4 = new TreeNode(8); TreeNode*node5 = new TreeNode(12); TreeNode*node6 = new TreeNode(16);
root->left = node1; root->right = node2;
node1->left = node3; node1->right = node4;
node2->left = node5; node2->right = node6;
Solution solution;
TreeNode*head = solution.Convert(root);
TreeNode*temp = head;
cout << "从左往右打印链表" << endl;
while (temp != NULL)
{
cout << temp->value << " ";
temp = temp->right;
}
cout << endl;
cout << "从右往左打印链表" << endl;
temp = head;
while (temp->right != NULL)
temp = temp->right;
while (temp != NULL)
{
cout << temp->value << " ";
temp = temp->left;
}
cout << endl;
system("pause");
return 0;
}