java实现二叉树的两种遍历方式,BFS和DFS

最近复习到了这个点,写点东西加强一下记忆吧

二叉树遍历

百度百科上是这么解释的:

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

很明显,遍历也会有着不同的方式,这里我们就简单的讲讲BFS和DFS

BFS(Breadth First Search)广度优先遍历

这种遍历方式可以理解为二叉树的层序遍历,即每层遍历完再去找下一层的内容,这里用图来表示更加直观:
在这里插入图片描述
那么我们就来开始思考,这种层序遍历该怎么用代码的方式表现出来,我们可以通过Queu的方式把这每一层的内容先暂时存储起来,根据队列的先进先出的效果,再后续取出来,那么难点就在于如何定位到每个结点上来判断他的左右孩子结点,答案便是我们可以直接在Queue中存储的就是他的TreeNode的形式,这样我们在将他放入的时候,可以直接定位到这个结点以便进行后续的添加操作。

import java.util.*;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        ArrayList<Integer> list =new ArrayList<>();
        if(root==null){
            return list;
        }
        Queue<TreeNode> queue =new LinkedList<>();
        
        queue.offer(root);
        
        while(!queue.isEmpty()){
            TreeNode treeNode =queue.poll();
            
            list.add(treeNode.val);
            
            if(treeNode.left!=null){
                queue.offer(treeNode.left);
            }
            if(treeNode.right!=null){
                queue.offer(treeNode.right);
            }
        }
        
        return list;
    }
    
   
}
DFS(Depth First Search)深度优先遍历

先从根节点出发,沿着左子树进行纵向遍历直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止。

在这里插入图片描述
一开始看到DFS我是真的挺懵逼的,没什么入手的点,后来想到了BFS可以使用Queue的方式,那么 DFS有没有对应的数据结构呢,有的!栈!

 public static List<Integer> DFSByStack(TreeNode root) {
        if (root == null) {
            return null;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);

        List<Integer> result = new ArrayList<>();

        while (!stack.isEmpty()) {
            TreeNode treeNode = stack.pop();

            /*
            处理 TreeNode 节点 的逻辑
             */
            result.add(treeNode.val);

            if (treeNode.right != null) {
                stack.push(treeNode.right);
            }

            if (treeNode.left != null) {
                stack.push(treeNode.left);
            }

        }
        return result;
    }

既然使用了栈,那么我们还可以使用系统自带的一种栈(递归),但是要注意全局变量的问题

 public static List<Integer> DFSByRecursion(TreeNode root) {
        if (root == null) {
            return null;
        }
        /*
        处理节点的逻辑(由于是递归的调用,定义ArrayList的时候不能写在方法内部)
         private static List<Integer> result = new ArrayList<>();
         此处的 result 的定义为了一个全局变量
         */
        result.add(root.val);

        if (root.left != null) {
            DFSByRecursion(root.left);
        }
        if (root.right != null) {
            DFSByRecursion(root.right);
        }
        return result;
    }

补充Queue知识点

https://www.cnblogs.com/lemon-flm/p/7877898.html
感觉这个大佬写的特别详细!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值