前序遍历 也是 深度优先搜索的一种
我们可以通过递归和迭代来实现前序遍历
递归版,主要就是先打印根节点,然后遍历根节点的左子树,遍历左子树以此类推也是首先打印根节点,再继续遍历左子树根节点的左子树和右子树,直至左子树为空,则返回,接着遍历右子树,直至为空,
接着遍历根节点的右子树,以此类推
List<Integer> resList = new LinkedList<>();
public List<Integer> preorderTraversal(TreeNode root) {
dfs(root);
return resList;
}
private void dfs(TreeNode root) {
if(root == null){
return ;
}
resList.add(root.val);
dfs(root.left);
dfs(root.right);
}
迭代版,我们通过 使用栈,来实现深度优先遍历,通过首先访问根节点,然后访问左子树,然后访问右子树来实现前序遍历
首先将根节点进行打印,接着获取其左节点后将根节点压栈,继续打印左节点,并获取左节点的左节点后将左节点压栈,以此类推,直至左节点为空,则将栈顶节点弹栈,获取其右节点,
打印右节点后,获取右节点的左节点,打印左节点,并获取左节点的左节点,并将左节点压栈,
直至左节点的左节点为空,则继续弹栈或者右节点,以此类推
public List<Integer> preorderTraversal(TreeNode root) {
// 定义栈
Stack<TreeNode> stack = new Stack<>();
List<Integer> resList= new LinkedList<>();
// 如果根节点不等于空或者栈不为空,则进入循环
while(root!=null || !stack.isEmpty()) {
while(root != null) {
// 如果根节点不为空
// 则 结果集增加根节点 值
resList.add(root.val);
// 将根节点压栈
stack.add(root);
// 根节点赋值为其左节点
root = root.left;
}
// 出栈,将其右节点赋值为根节点
root = stack.pop().right;
}
//返回结果
return resList;
}