题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
问题是将二叉搜索树转换成一个排序的双向链表,考虑到二叉搜索树的中序遍历序列为排序序列,所以可用中序遍历的递归做法来调整指针。在遍历过程中,调整指针pLast使其指向当前已转换好双向链表的末尾也就是最大数字,这样每当遍历到一个节点,只需要调整两次指针:
- 调整当前结点的left指针指向pLast
- 调整pLast指向结点的right指针指向当前结点
这样递归调整完成后,pLast指向的就是双向链表的最后一个节点,要返回的是头结点,所以依次向前调整pLast直至其左指针为空即指向头结点。
代码
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 };*/ 10 class Solution { 11 public: 12 TreeNode* pLast=NULL; 13 TreeNode* Convert(TreeNode* pRoot) 14 { 15 if(!pRoot) 16 return NULL; 17 ToList(pRoot); 18 while(pLast->left) 19 pLast=pLast->left; 20 return pLast; 21 } 22 void ToList(TreeNode* pRoot){ 23 if(pRoot){ 24 if(pRoot->left) 25 ToList(pRoot->left); 26 if(pLast){ 27 pLast->right=pRoot; 28 pRoot->left=pLast; 29 } 30 pLast=pRoot; 31 if(pRoot->right) 32 ToList(pRoot->right); 33 } 34 } 35 };