Morris 中序遍历过程如下:
1.当前结点的左孩子是否为空,若是则输出当前结点,更当前结点为当前结点的右孩子;否则进入2;
2.在当前结点的左子树中寻找中序遍历下的前驱结点(左子树中最右结点)
a. 若前驱结点的右孩子为空,则将前驱结点的右孩子指向当前结点,当前结点更新为当前结点的左孩子;进入3;
b. 若前驱结点的右孩子为当前结点(不为空),将前驱结点的右孩子置NULL,输出当前结点,当前结点更新为当前结点的右孩子,进入3;
3.若当前结点不为空,进入1;否则程序结束;
publicstaticvoidinOrder(TreeNode root){
TreeNode cur = root, pre = null;for(; cur != null;){if(cur.left != null){
pre = cur.left;// find predecessorwhile(pre.right != null && pre.right != cur)
pre = pre.right;if(pre.right == null){// create thread
pre.right = cur;
cur = cur.left;}else{print(cur);
pre.right = null;
cur = cur.right;}}else{print(cur);
cur = cur.right;}}}