题解 | #二叉搜索树与双向链表#
二叉搜索树与双向链表
https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree) {
// 如果树为空,则直接返回nullptr
if (pRootOfTree == nullptr) {
return nullptr;
}
TreeNode* prev = nullptr; // 用于跟踪当前节点的前一个节点
TreeNode* head = nullptr; // 用于记录链表的头节点
// 执行中序遍历,并在遍历过程中调整节点指针以形成双向链表
inorder(pRootOfTree, prev, head);
// 返回链表的头节点
return head;
}
private:
void inorder(TreeNode* node, TreeNode*& prev, TreeNode*& head) {
// 如果当前节点为空,则直接返回
if (node == nullptr) {
return;
}
// 先遍历左子树
inorder(node->left, prev, head);
// 处理当前节点
if (prev != nullptr) {
// 如果前一个节点存在,则设置前一个节点的右指针指向当前节点,并设置当前节点的左指针指向前一个节点
prev->right = node;
node->left = prev;
} else {
// 如果前一个节点不存在,则当前节点是链表的头节点
head = node;
}
// 更新前一个节点为当前节点
prev = node;
// 再遍历右子树
inorder(node->right, prev, head);
}
};
