morris - juedaiyuer/researchNote GitHub Wiki

#Morris二叉树遍历#

/*
*  Task: Morris中序遍历
*
*  时间复杂度为O(n), 额外空间复杂度为O(1)
*
*  @param head 二叉树的根节点
*
*  步骤:
*  1. 假设当前子树的头节点为h,让h的左子树中的最右节点的right指针指向h
*  2. h的左子树继续步骤1,直到遇到某一个节点没有左子树时记为node---代码中为cur2
*
*  从node开始通过每一个节点的right指针进行移动,并依次打印
*
*  3. 假设移动到的节点定义为cur,cur节点的左子树最右节点是否指向cur---此时的cur为之前操作过的cur2
*  4. 如果是,让cur节点的左子树中最右节点的right指针指向空,将步骤1逐渐调整过来;打印cur
*  5. cur的right指针移动到下一个节点,重复步骤4
*  6. 如果不是,以cur为头的子树重回步骤1执行
*
*
* */
public void morrisIn(TreeNode head){
	if (head == null){
	    return ;
	}

	TreeNode cur1 = head;   // 当前树
	TreeNode cur2 = null;   // cur2工具型节点

	while (cur1 != null){
	    cur2 = cur1.left;   // cur2 当前树的左子树
	    if (cur2 != null){

	        // 左子树最右节点
	        while (cur2.right !=null && cur2.right != cur1 ){
	            cur2 = cur2.right;
	        }

	        // 最右节点为空
	        if (cur2.right == null){
	            cur2.right = cur1;  // 指向当前树的头节点
	            cur1 = cur1.left;   // 当前树的左子树继续循环
	            continue;           // 中断本次循环,直接进入while下一个循环

	        } else {
	            cur2.right = null;  // 步骤5
	        }
	    }

	    System.out.print(cur1.value +" ");
	    cur1 = cur1.right;
	}

	System.out.println();
}