public void mirrisPre(TreeNode cur) {
if(cur == null) return;
TreeNode root = cur; // 保存根节点,因为再后序的遍历中cur引用一直再变。
TreeNode mostRight = null;
while(cur != null) {
mostRight = cur.left;
if(mostRight != null) {
while(mostRight.right != null && mostRight.right != cur) { // 如果右边不为空,并且右边不指向后继节点的话就找到其前继节点
mostRight = mostRight.right;
}
if(mostRight.right == null) { // 建立线索指针
mostRight.right = cur;
cur = cur.left;
continue;
} else { // 删除线索指针
mostRight.right = null;
printNode(cur.left);
}
}
cur = cur.right; // 向右走
}
printNode(root.left); // 打印根节点的最右边链表
}
// 打印右边的链表
public void printNode(TreeNode head) {
TreeNode tail = reverse(head);
while(tail != null) {
System.out.println(tail.val);
tail = tail.right;
}
reverse(tail);
}
// 反转链表
public TreeNode reverse() {
TreeNode prev = null,curr,next;
curr = head;
while(curr != null) {
next = curr.right;
curr.right = prev;
prev = curr;
curr = next;
}
return prev;
}