根据描述,排序的双向链表与二叉搜索树的关系可以确定,二叉搜索树的中序遍历结果是一个有序序列,能确定的是中序遍历结果的首元素应是链表的第一个节点。
然后就是根据中序遍历结果将树的结构改变为链表的结构,每个节点都有两个指向,一个left一个right,在中序遍历过程中,将拿到的每个节点的left指向比他小的元素中最大的那个,right指向比他大的元素中最小的那个。而在中序遍历过程中,left的指向即是刚刚遍历过的前一个节点,right指向是即将要遍历的后一个节点。
class Solution {
public:
void _Convert(TreeNode* root,TreeNode*& prev){
if(nullptr == root){
return;
}
//不空 递归处理左子树
_Convert(root->left,prev);
root->left = prev;
if(prev){
prev->right = root;
}
prev = root;
_Convert(root->right,prev);
}
TreeNode* Convert(TreeNode* pRootOfTree) {
if(nullptr == pRootOfTree){
return nullptr;
}
//找链表的第一个节点既树最左边的节点
TreeNode* head = pRootOfTree;
while(head->left){
head = head->left;
}
//中序遍历,修改左右指针指向
TreeNode* prev = nullptr;
_Convert(pRootOfTree,prev);
return head;
}
};