题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
参考博客:https://www.cnblogs.com/yi-hui/p/8983825.html
BST的中序遍历输出一个有序的线性表,这是基本策略。定义两个指针,head
表示链表的头结点,tail
表示递归过程中的尾节点。初始化头结点和尾节点都是空。BST非空的情况下,中序遍历的第一个节点作为head
和tail
的初始值。如果head
不是空,说明此时不是初始化状态,那么就应该执行链接操作。因为tail
的初始化方式决定了tail
标记的节点始终是有序链表的尾节点,那么递归过程中的tail
相当于递归过程中root的左孩子,执行向左连接即可。
AC代码
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree) {
if(pRootOfTree == nullptr) { // 递归结束
return nullptr;
}
Convert(pRootOfTree->left); // 递归向左处理
if(head == nullptr) { // 追加第一个节点,相当于全局的初始化
head = pRootOfTree;
tail = pRootOfTree;
} else {
tail->right = pRootOfTree;
pRootOfTree->left = tail;
tail = pRootOfTree;
}
Convert(pRootOfTree->right); // 递归向右处理
return head;
}
TreeNode* head{nullptr};
TreeNode* tail{nullptr};
};