题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路分析:
这道题一开始的思路是借用队列结构,首先中序遍历二叉树,按顺序保存结点,再依次出队列,创建前向后向指针。但由于题目的设定是不允许创建新的结点结构,所以考虑其他方法。
在做二叉树相关的题时,一般都利用递归完成。本题中需要用一个指向当前链表最后结点的指针来完成,对于每个新输入的树,对左子树做递归操作,保证每次都更新指向当前链表最后结点的指针,那么当完成左子树时,当前根的前向指针(左指针)就指向其左子树链表的最后一个结点,同时去判断最后这个结点是否为空,若不为空,它的后向指针(右指针)就指向当前的根。接下来就更新这个最后结点的指针指向当前的根结点,再对右子树做同样操作。
参考了一篇博客,说得相对清晰,https://cuijiahua.com/blog/2017/12/basis_26.html
代码:
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* Convert(TreeNode* pRootOfTree) 13 { 14 TreeNode* pLastNodeInList = nullptr; 15 ConvertNode(pRootOfTree, &pLastNodeInList); 16 17 while(pLastNodeInList!=nullptr && pLastNodeInList->left!=nullptr) 18 { 19 pLastNodeInList = pLastNodeInList->left; 20 } 21 return pLastNodeInList; 22 } 23 24 void ConvertNode(TreeNode* pRoot, TreeNode** pLastNode) 25 { 26 if(pRoot==nullptr) 27 return; 28 if(pRoot->left!=nullptr) 29 ConvertNode(pRoot->left, pLastNode); 30 pRoot->left = *pLastNode; 31 if(*pLastNode!=nullptr) 32 { 33 (*pLastNode)->right = pRoot; 34 } 35 *pLastNode = pRoot; 36 if(pRoot->right!=nullptr) 37 { 38 ConvertNode(pRoot->right, pLastNode); 39 } 40 } 41 };