algorithm-base/animation-simulation/二叉树/二叉树的前序遍历(Morris).md

106 lines
4.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### Morris
Morris
![Morris](https://img-blog.csdnimg.cn/20210622155959185.gif)
![image](https://cdn.jsdelivr.net/gh/tan45du/test@master/image.1u3at0ckvn34.png)
Morris ```` right 2 9 9 right 2
Morris
1. p1.left == null p1 = p1.right( right )
2. p1.left != null p1 ( p2 ) right right
3. - p2 right p1p1, p1 = p1.left
- p2 right p1 right p1 p1 = p1.right
p1 root
p2 = p1.left p2 p1 5 right root root
![image](https://cdn.jsdelivr.net/gh/tan45du/test@master/image.3h60vcjhqo80.png)
p1 p1 = p1.left
p2 = p1.left 4 p1 9 right 2
![image](https://cdn.jsdelivr.net/gh/tan45du/test@master/image.zq91mdjkyzk.png)
p1, p1 = p1.leftp2 = p1.left 8 right p1
![image](https://cdn.jsdelivr.net/gh/tan45du/test@master/image.5vsh71yrzxs0.png)
right p1, right
p1 p1 = p1.leftp2 = p.left p2 == null,
![image](https://cdn.jsdelivr.net/gh/tan45du/test@master/image.zk7nxrjdgr.png)
p1, p1 = p1.left p1 = p1.right 4 p2 = p1.left
![image](https://cdn.jsdelivr.net/gh/tan45du/test@master/image.1pjni9r6tkps.png)
p2.right != null 4 right right p1 = p1.right
![image](https://cdn.jsdelivr.net/gh/tan45du/test@master/image.17t7n8yy340w.png)
p1 ,
On O1
####
```java
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
TreeNode p1 = root; TreeNode p2 = null;
while (p1 != null) {
p2 = p1.left;
if (p2 != null) {
//找到左子树的最右叶子节点
while (p2.right != null && p2.right != p1) {
p2 = p2.right;
}
//添加 right 指针,对应 right 指针为 null 的情况
if (p2.right == null) {
list.add(p1.val);
p2.right = p1;
p1 = p1.left;
continue;
}
//对应 right 指针存在的情况,则去掉 right 指针
p2.right = null;
} else {
list.add(p1.val);
}
//移动 p1
p1 = p1.right;
}
return list;
}
}
```