基本思路:
- 二叉搜索树要转换成排序链表,必然是左中右的中序遍历
- 函数返回值是双向链表的头节点,而每次遍历节点需要的是当前节点中序遍历下的先驱节点,所以需要一个额外指针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;
}
};

京公网安备 11010502036488号