Morris算法
基本思路:
首先中序遍历顺序是:左 根 右
- 当左子树为空:访问当前节点
- 当左子树不为空:先找到它的前驱pre,
【1】若果前驱pre的右指针指向cur,说明整个左子树都已经被访问了,此时访问当前节点,然后cur=cur.right即可
【2】如果前驱右指针没有指向cur,说明整个左子树没有被访问,此时
将前驱的右指针指向cur,然后cur=cur.left即可
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<Integer> ans = new ArrayList<>();
//左 根 右
public List<Integer> inorderTraversal(TreeNode root) {
TreeNode cur=root;
TreeNode pre=null;
while(cur!=null){
//没有左子树
if(cur.left==null){
ans.add(cur.val);
cur=cur.right;
continue;
}
//有左子树 找到前驱(前驱是左子树最右边的)
pre=cur.left;
while(pre.right!=null && pre.right!=cur) pre=pre.right;
//左边已经完全访问过 那么访问当前节点
if(pre.right==cur){
pre.right=null;
ans.add(cur.val);
cur=cur.right;
}
//左边没有访问过 先访问左边 然后把前驱右指针指向cur
else if(pre.right==null){
pre.right=cur;
cur=cur.left;
}
}
return ans;
}
}