心路历程:

实际上刚开始看这道题,是一脸懵逼的,官方的讲解让我更闷逼了,之后,看了b站上,一个同学的讲的(《剑指 Offer 36. 二叉搜索树与双向链表》),才突然有了灵感,慢慢想回二叉树中序遍历的样子。就是下面的样子。

那在搜索二叉树转双向链表,里面的二叉树中序遍历,其实是一样的,只是增加了两个变量prev和head来记录前节点和头节点。

而curr变量,就是之前递归时传入的root,不过这里取名curr,更有利于理解而已。

解题思路:

1、定义prev、head指针,prev记录上一个节点,用作curr节点重新指向的,head用于返回头节点;

2、实现中序遍历的递归函数,在visit(T) 部分,处理相应的重新指向操作即可

3、返回头节点,作为结果。

import java.util.*;

public class Solution {
    TreeNode prev; 
    TreeNode head;

    public TreeNode Convert(TreeNode pRootOfTree) {
        if (pRootOfTree == null) {
            return null;
        }
        inOrderTreeNode(pRootOfTree);
        return head;
    }

    void inOrderTreeNode(TreeNode curr) {
        if(curr == null) {
            return;
        }
	  
        // 1. 中序遍历,先遍历左节点
        inOrderTreeNode(curr.left);

        // 2.中序遍历visit(T) ,哈哈,居然现在才发现,这就是为什么要多做题的道理
        // 这里的curr就是以前的 res.add(root.val) 还记得不?
        if(prev == null) {
            prev = curr;  // 中序遍历的第一个节点,是最左的节点,所以,这个时候,pre肯定是空的
            head = curr; // 同时把head赋值,给到外面
        } else {
             prev.right = curr;
             curr.left = prev;
        }
        prev = curr; //把curr赋值给prev方便下次使用。
        // 3. 中序遍历,后遍历右节点
        inOrderTreeNode(curr.right);
    }
}