LeetCodeAnimation/notes/LeetCode第144号问题:二叉树的前序遍历.md
程序员吴师兄 5dee53d957 更换图片地址
2019-11-14 11:00:28 +08:00

79 lines
2.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LeetCode 144 号问题二叉树的前序遍历
> 本文首发于公众号五分钟学算法[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
题目来源于 LeetCode 上第 144 号问题二叉树的前序遍历题目难度为 Medium目前通过率为 59.8%
### 题目描述
给定一个二叉树返回它的 *前序* 遍历
**示例:**
```
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
```
**进阶:** 递归算法很简单你可以通过迭代算法完成吗
### 题目解析
**(Stack)**的思路来处理问题
前序遍历的顺序为**--**具体算法为
- 把根节点 push 到栈中
- 循环检测栈是否为空若不空则取出栈顶元素保存其值
- 看其右子节点是否存在若存在则 push 到栈中
- 看其左子节点若存在 push 到栈中
### 动画描述
![](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/uu82j.gif)
### 代码实现
```
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
//非递归前序遍历,需要借助栈
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new LinkedList<>();
//当树为空树时直接返回一个空list
if(root == null){
return list;
}
//第一步是将根节点压入栈中
stack.push(root);
//当栈不为空时出栈的元素插入list尾部。
//当它的孩子不为空时,将孩子压入栈,一定是先压右孩子再压左孩子
while(!stack.isEmpty()){
//此处的root只是一个变量的复用
root = stack.pop();
list.add(root.val);
if(root.right != null) stack.push(root.right);
if(root.left != null) stack.push(root.left);
}
return list;
}
}
```
![](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/obddd.png)