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

173 lines
7.1 KiB
Java
Raw Normal View History

2021-05-13 06:28:39 +00:00
, ,`,,`.
![](https://img-blog.csdnimg.cn/20210504155755565.gif)
###
![image](https://cdn.jsdelivr.net/gh/tan45du/test@master/image.622242fm7dc0.png)
[1,2,3]
1 2 3
>
2021-05-21 10:34:13 +00:00
``
2021-05-13 06:28:39 +00:00
![](https://img-blog.csdnimg.cn/20210512205822221.gif)
2021-05-21 10:34:13 +00:00
`` root while
2021-05-13 06:28:39 +00:00
O(n)
O(n) O(logn) O(n)
****
```java
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
if (root == null) return list;
stack.push(root);
while (!stack.isEmpty()) {
TreeNode temp = stack.pop();
if (temp.right != null) {
stack.push(temp.right);
}
if (temp.left != null) {
stack.push(temp.left);
}
//这里也可以放到前面
list.add(temp.val);
}
return list;
}
}
```
### Morris
2021-05-21 10:34:13 +00:00
Morris
2021-05-13 06:28:39 +00:00
2021-05-21 10:34:13 +00:00
![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;
}
}
```