解析:(递归遍历)
题目要求:实现二叉树的前序遍历
大体思路:
二叉树深度优先遍历,常用的遍历方式:递归
递归三要素:
①参数和返回值:参数为TreeNode和记录结果的res,返回值为void
②终止条件:当遍历完叶子结点时终止,也就是TreeNode==null,return;
③确定单层的递归逻辑:前序遍历是中左右,先保存根结点,再去遍历左子树,再去遍历右子树。
代码:(递归遍历)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> res = new ArrayList<>();
preorder(root, res);
return res;
}
public void preorder(TreeNode root, ArrayList<Integer> res) {
// 终止条件是碰到了叶子结点下的null
if (root == null) return;
res.add(root.val); // 中
preorder(root.left, res); // 左
preorder(root.right, res); // 右
}
}
解析:(迭代法遍历)
大体思路:递归如果需要使用非递归实现,一般使用栈。
前序遍历:中左右
第一次将根节点压入栈中
每次循环弹出根结点,记录根节点的val
先将根节点的右子树压入栈,再将根结点的左子树压入栈,(因为栈是先进后出,出栈就是左子树先出栈,右子树后出栈)
使用栈代替递归的原理:栈的先入后出,和递归的思路相似,先执行完后面的开的程序,最后执行前面的开的程序
代码:(迭代法遍历)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
ArrayList<Integer> res = new ArrayList<>();
if (root == null) return res;
stack.add(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
// 保存根结点
res.add(node.val);
// 因为栈先进后出,后处理右子树,先让右子树进栈
if (node.right != null) stack.push(node.right);
// 因为栈先进后出,先处理左子树,就要让左子树后进栈
if (node.left != null) stack.push(node.left);
}
return res;
}
}