题目描述:
题目链接: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;}
}