基本思路:
- 二叉搜索树要转换成排序链表,必然是左中右的中序遍历
- 函数返回值是双向链表的头节点,而每次遍历节点需要的是当前节点中序遍历下的先驱节点,所以需要一个额外指针bef记录先驱节点
- 先按照左中右的遍历顺序遍历左子树,然后将先驱节点与当前节点连接,此时需要遍历右子树了,所以需要让先驱节点指向当前节点,再遍历右子树
- 处理边界问题
class Solution { public: TreeNode* bef = nullptr; TreeNode* Convert(TreeNode* pRootOfTree) { if (!pRootOfTree) return nullptr; TreeNode* l = Convert(pRootOfTree->left), *r = pRootOfTree->right; if (bef) { bef->right = pRootOfTree; } pRootOfTree->left = bef; pRootOfTree->right = nullptr; bef = pRootOfTree; Convert(r); return l?l: pRootOfTree; } };