publicclassSolution{publicvoidflatten(TreeNoderoot){if(root ==null)return;flatten(root.left);flatten(root.right);TreeNode left =root.left;TreeNode right =root.right;root.left=null;root.right= left;while(root.right!=null){ root =root.right;}root.right= right;}}
于是这题有特别赞的O(n)时间O(1)空间写法,还是利用 Morris 遍历。
Morris 遍历的特点是寻找左子树中能沿着右边走最长的节点,并且利用这个节点做文章;这题是把 right 指针直接指向 root 的右节点了,相当于每次缩进去【root.left -> 左子树最长向右路径】这段到右子树上,如此反复。因此省去了最坏情况下重复遍历寻找链表尾的过程。