什么是前序遍历?
一个二叉树的前序遍历就是对于树中的每一个节点而言,都是先遍历自己,再遍历左右。
如:
递归实现前序遍历
题目链接:144. 二叉树的前序遍历 - 力扣(LeetCode)
实现步骤:
① 当前节点为空,不用遍历
② 访问当前节点
③ 遍历左子树
④ 遍历右子树
代码如下:
class Solution {
// 存储前序遍历结果
private LinkedList<Integer> ans = new LinkedList<>();
public List<Integer> preorderTraversal(TreeNode root) {
// 空树,直接返回
if(root == null) {
return ans;
}
// 访问当前节点
ans.addLast(root.val);
// 遍历左子树
preorderTraversal(root.left);
// 遍历右子树
preorderTraversal(root.right);
// 返回先序遍历结果
return ans;
}
}
栈实现前序遍历
步骤如下:
① 从栈中弹出当前节点进行访问
② 右节点入栈
③ 左节点入栈
这里因为要实现 当前节点、左孩子、右孩子
这样的遍历顺序,结合栈后进先出
的特点,应该让左孩子后进,右孩子先进
代码实现如下:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
LinkedList<Integer> ans = new LinkedList<>();
if (root != null) {
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
// 访问当前节点
TreeNode cur = stack.pop();
ans.addLast(cur.val);
// 要实现遍历完当前节点之后就遍历左子树,再遍历右子树
// 结合栈 " 后进先出 " 的特点可以知道,要想下次访问左节点,那么应该左节点后进入,右节点先进入
if (cur.right != null) {
stack.push(cur.right);
}
if (cur.left != null) {
stack.push(cur.left);
}
}
}
return ans;
}
}