题目描述:
题目链接:LeetCode-144-二叉树的前序遍历
递归法
解题思路:
方法一:递归。
要先清楚前序遍历的顺序:先根节点,再左子树,再右子树。
然后是递归三部曲:
- 确定递归函数的参数和返回值:这里直接使用力扣给的函数即可,不需要额外定义;
- 终止条件:当当前遍历的节点为null 的时候结束递归;
- 确定单层递归的逻辑:也就是递归的顺序:先根节点,再左子树,再右子树。
代码实现:
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
list.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
return list;
}
}
非递归法
解题思路:
方法二:非递归
要先清楚前序遍历的顺序:先根节点,再左子树,再右子树。
利用栈
的特点:”先进后出“,来存放遍历的节点。
前序遍历:中左右。 则 入栈顺序: 中->右->左
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
if (root == null) {
return new ArrayList<>();
}
stack.push(root);// 根节点先入栈
// 前序遍历:中左右 入栈顺序: 中->右->左
// 开始处理栈,先放右孩子,再放左孩子,这样出栈的顺序才是 前序遍历的顺序
while (!stack.isEmpty()) {
TreeNode tmp = stack.pop();
if (tmp != null) {// 加一个判断,不为空再加入
list.add(tmp.val);// 加到数组中
} else {
continue;
}
stack.push(tmp.right);// 依次加入右孩子和左孩子
stack.push(tmp.left);
}
return list;
}
}