Morris算法中序遍历二叉树
1.树节点的定义
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
2.Morris算法步骤:(该算法的核心就是其前序连接)
①若当前节点左子树为空(左子树为空那么其没有前序节点),那么打印当前节点进入右子树
②若当前节点左子树不为空(说明它有前序节点),看其前序节点的右指针,其实只有两种可能,
1.要么指向它本身:如果指向当前节点(这个时候相当于左子树已经遍历完了,又回到这里的)
,打印当前节点,进入右节点(如果你想保持树的原始结构,可以把前序节点的右指针改回初始状态,即null)
2.要么指向空:(当然刚开始初始状态当然是是空),如果是空,那么将其指向当前节点,进入左子树
最后就是上述过程的出口:当前节点为空是则结束该算法
3.代码实现
该算法并没有借助其他的辅助空间,算法在位性好 (该算法建议自己画图去走一遍,加深印象)
上述算法中提到了获取前序节点,下面我给出代码
获取前序节点代码实现
public TreeNode getPredecessor(TreeNode current)//获取中序遍历的前序节点
{
if(current==null||current.left==null)
return null;
TreeNode pre = current.left;
while(pre.right!=null&&pre.right!=current)//不可以只是null,因为加了加了前序连接,否则出现死循环
pre=pre.right;
//System.out.println(pre.val);
return pre;
}
Morris算法代码实现
//该算法严格按照上面的步骤实现
public void MorrisTravel(TreeNode root)//莫里斯中序遍历
{
TreeNode pre;
TreeNode current = root;
while(current!=null)
{
if(current.left==null)
{
System.out.println(current.val);
current=current.right;
}
else
{
pre = getPredecessor(current);
if(pre.right==null)
{
pre.right=current;
current = current.left;
}
else if(pre.right==current)
{
pre.right=null;//这里我是为了保持树的原始结构
System.out.println(current.val);
current = current.right;
}
}
}
}
继续加油,向未来!