把原本的递归形式转换成迭代的形式,但是整体的思想还是不变的,
其实就是把递归的过程 翻译 成while + if 。
LeetCode94.二叉树的中序遍历(非递归)
方法1.
Morris Traversal 线索树
时间是O(n) 空间O(1)的解法 :
参考:
https://blog.csdn.net/dxx707099957/article/details/88550437?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
要使用O(1)空间进行遍历,最大的难点在于,遍历到子节点的时候怎样重新返回到父节点(假设节点中没有指向父节点的p指针),由于不能用栈作为辅助空间。为了解决这个问题,Morris方法用到了线索二叉树(threaded binary tree)的概念。在Morris方法中不需要为每个节点额外分配指针指向其前驱(predecessor)和后继节点(successor),只需要利用叶子节点中的左右空指针指向某种顺序遍历下的前驱节点或后继节点就可以了。
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans= new ArrayList<>();
TreeNode cur = root, pre = null;
while (cur != null) {
if (cur.left == null) {
ans.add(cur.val);
cur = cur.right;// 前进,可能到真正的右儿子,也可能是下一个节点
} else {
pre = cur.left;
while (<