Morris中序遍历
Morris 遍历算法是另一种遍历二叉树的方法,它能将非递归的中序遍历空间复杂度降为 O(1)
缺点是改变了整个树的结构,强行把一棵二叉树改成一段链表结构。
我们将黄色区域部分挂到节点5的右子树上,接着再把2和5这两个节点挂到4节点的右边。
这样整棵树基本上就变改成了一个链表了,之后再不断往右遍历。
class Solution {
public List<Integer> inorderTraversal(TreeNode root){
List<Integer> result = new ArrayList<>();
while (root != null){
//左 不为空情况
if (root.left != null){
//找到左子树的最右节点
TreeNode pre = root.left;
//找到最右节点
while (pre.right != null){
pre = pre.right;
}
//此时pre指向的即root左子树的最右节点
//pre的右指向root
pre.right = root;
//root清空左边的连接,往左走一个
TreeNode tmp = root;
root = root.left;
tmp.left = null;
}else {
//左为空情况
result.add(root.val);
root = root.right;
}
}
return result;
}
}