1. public void mirrisPre(TreeNode cur) {
    2. if(cur == null) return;
    3. TreeNode root = cur; // 保存根节点,因为再后序的遍历中cur引用一直再变。
    4. TreeNode mostRight = null;
    5. while(cur != null) {
    6. mostRight = cur.left;
    7. if(mostRight != null) {
    8. while(mostRight.right != null && mostRight.right != cur) { // 如果右边不为空,并且右边不指向后继节点的话就找到其前继节点
    9. mostRight = mostRight.right;
    10. }
    11. if(mostRight.right == null) { // 建立线索指针
    12. mostRight.right = cur;
    13. cur = cur.left;
    14. continue;
    15. } else { // 删除线索指针
    16. mostRight.right = null;
    17. printNode(cur.left);
    18. }
    19. }
    20. cur = cur.right; // 向右走
    21. }
    22. printNode(root.left); // 打印根节点的最右边链表
    23. }
    24. // 打印右边的链表
    25. public void printNode(TreeNode head) {
    26. TreeNode tail = reverse(head);
    27. while(tail != null) {
    28. System.out.println(tail.val);
    29. tail = tail.right;
    30. }
    31. reverse(tail);
    32. }
    33. // 反转链表
    34. public TreeNode reverse() {
    35. TreeNode prev = null,curr,next;
    36. curr = head;
    37. while(curr != null) {
    38. next = curr.right;
    39. curr.right = prev;
    40. prev = curr;
    41. curr = next;
    42. }
    43. return prev;
    44. }