第一,二叉搜索树中序遍历递增有序
第二,局部逐渐改造成双链表,一个元素先初始化if语句只执行第一次。else以后每执行一次都可以看作把一个元素加入其中(即加入的元素进行了双连接,然后更新加入的元素为pre为下一次加入元素做准备)
可以看成横向的 4(初始化p),加入下一次要访问的元素6,p指向当前元素4, pre->right = pRootOfTree; 4--》6,建立双链接, pRootOfTree->left = pre;《4------6,更新p, pre = pRootOfTree;本来就有6---》8
对于R(8) pre->right = pRootOfTree,就已经是这个指向的。 pRootOfTree->left = pre;建立6《-----8的连接,更新pre为8
第三再没有要求不能更改结点值的情况下,可以遍历链表取出值然后建立双向连接。空间复杂度为0(n)取值时的辅助数组,而递归最差空间复杂度为o(n),为递归栈的深度
class Solution {
public://返回的第一个指针,即为最小值,先定为null fast-template
TreeNode* head = NULL;
//中序遍历当前值的上一位,初值为最小值,先定为null
TreeNode* pre = NULL;
TreeNode* Convert(TreeNode* pRootOfTree) {
if(pRootOfTree == NULL)
//中序递归,叶子为空则返回
return NULL;
//首先递归到最左最小值
Convert(pRootOfTree->left);
//找到最小值,初始化head与pre
if(pre == NULL){
head = pRootOfTree;
pre = pRootOfTree;
}
//当前结点与上一结点建立连接,将pre设置为当前值
else{
pre->right = pRootOfTree;-----------------------------------------------------
pRootOfTree->left = pre;
pre = pRootOfTree;
}
Convert(pRootOfTree->right);
return head;}
};