中序遍历
对于每一个节点来说:
- 如果该节点没有左子树(如节点1,节点4),则直接打印该节点,然后转到右子节点。
- 如果有左子树(如节点3,节点5),则我们首先要找到该节点的前驱节点,(1是3的前驱,4是5的前驱),其实就是找左子树的最右节点,构建一个前驱节点到当前节点的连接,即将前驱节点的右子节点指向当前节点。
- 当我们第一次进入节点3、5时,我们会构建前驱节点到当前节点的连接;但是当我们从1、4节点利用我们第一次已经构建好的连接再次进入3、5时,我们可以通过是否已经构建过连接来判断这是第二次进入,如果是第二次,则直接打印该节点,然后再转向右子节点。
对于上面这副图来说,整个过程:
进入节点5 构建 4 -> 5右连接
进入节点3 构建 1 -> 3右连接
进入节点1 打印1 通过 1 -> 3 连接进入3
进入节点3 第二次进入3,打印3
进入节点4 打印4 通过 4 -> 5 连接进入5
进入节点5 第二次进入5, 打印5
注意: 中序遍历利用右子节点
代码:
public void inOrderMorris(TreeNode node){
while (node != null){
// 左子树为空 打印该节点
if (node.left == null)</