题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:
二叉搜索树,中序遍历就是排序的。
所以我们利用中序遍历,将前后两个结点连接在一起。
不过为了方便起见,我们可以用中序遍历的逆过程,最后遍历到最小的结点,并连接它,也可以输出为链表的首结点。
我们需要两个指针,记录一前一后的结点。
代码:
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 if(pRootOfTree == NULL) return NULL; 14 if(pRootOfTree->left == NULL && pRootOfTree->right == NULL) return pRootOfTree; 15 TreeNode* pHead = NULL; 16 RDL(pRootOfTree, pHead); 17 return pHead; 18 } 19 20 void RDL(TreeNode* pRootOfTree, TreeNode* &pHead) { // 中序遍历的逆过程 21 if(pRootOfTree == NULL) return; 22 if(pRootOfTree->right) { 23 RDL(pRootOfTree->right, pHead); // 右递归 24 } 25 pRootOfTree->right = pHead; // 连接后一个结点 26 if(pHead != NULL) { // 连接前一个结点 27 pHead->left = pRootOfTree; 28 } 29 pHead = pRootOfTree; // pHead前移 30 if(pRootOfTree->left) { 31 RDL(pRootOfTree->left, pHead); // 左递归 32 } 33 } 34 };