心路历程:
实际上刚开始看这道题,是一脸懵逼的,官方的讲解让我更闷逼了,之后,看了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); } }