import java.util.*; public class Solution { // 重点在于使用pre来保存当前节点的前一个节点 public TreeNode head = null; public TreeNode pre = null; public TreeNode Convert(TreeNode pRootOfTree) { // 整体的思路还是中序遍历递归,先Convert(root.left)再写逻辑处理,最后递归遍历右子树Convert(root.rieght) if(pRootOfTree == null) return null; // 首先递归到最左最小值,以题中的例子为例,这时候pre = 4,head = 4 Convert(pRootOfTree.left); if(pre == null){ head = pRootOfTree; pre = pRootOfTree; } // 当前节点与上一节点建立连接,将pre设置为当前值,pre就是遍历树的指针,而head的值只需要等于最左侧最小的节点就可以了,标记为链表的头 else{ // right连接后继节点,以题中的例子为例,第一个栈顶元素是4,下一个就是6,此时pre==4,pRootOfTree==6,pre.right = pRootOfTree就是将4的右指针指向后继,之后让6的左指针指向前驱pre。最后将pre的值等于当前栈顶元素6,之后出栈进行下一次递归。 pre.right = pRootOfTree; pRootOfTree.left = pre; pre = pRootOfTree; } Convert(pRootOfTree.right); return head; } }