使用广度优先算法(BFS)和深度优先算法(DFS)遍历树(Java)

DFS深度优先算法

简单的理解深度优先算法遍历树结构,算法从节点出发沿着子节点一直往下走,走到没有字节点为止开始返回,即一直走到树的最深处(叶节点),然后开始往前返回值。

递归DFS

深度优先算法的递归表示十分简洁,理解递归DFS十分有助于理解树结构以及递归。

public void dfsRecursive(TreeNode root){
        //对于递归算法,basecase是首要考虑的
        if (root==null) return ans;
            //在两次递归之前fc进行操作即为前序遍历
        dfsRecursive(root.left);
        System.out.println(root.val);//在两次递归之间进行操作即为中序遍历
        dfsRecursive(root.right);
            //在两次递归之后进行操作即为后序遍历
        return ans;
    }

非递归DFS

根据DFS的定义,DFS一路往深处走,并记录走过的节点,走到底时再进行弹出并输出。因此很容易想到需要使用栈结构。

public  void dfs(TreeNode root) {
        if(root==null) return;
        Stack stack = new Stack<>();
        stack.push(root);
        while (stack.size() > 0) {
            TreeNode node = stack.pop();
            //同样的如果要进行的操作在递归之前,那么就是前序遍历,见名知意
            System.out.println(node.val);
            if (node.right != null) stack.push(node.right);
            if (node.left != null) stack.push(node.left);
        }
      
    }

通过DFS递归与非递归的算法可以很容易的完成非常基础的leetcode树的遍历题

  • 94. 二叉树的中序遍历
  • 144.二叉树的前序遍历
  • 145. 二叉树的后序遍历

BFS广度优先算法(非递归)

广度优先算法BFS,又称层序遍历,正如其名,按一层一层遍历树结构,一般情况下只有非递归的表达,由于其算法按层遍历的特性,其中用到的数据结构为Queue队列,因此递归的表达较为复杂。

public void bfs(TreeNode root) {
        if (root == null) return void;
        Queue queue = new LinkedList<>();
        queue.offer(root);
        while (queue.size() > 0) {
            for (int i = 0; i < queue.size(); i++) {
                TreeNode node = queue.poll();
                System.out.println(node.val);
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
        }
    }

leetcode关于bfs的题目,这里推荐两道十分基础的便于熟悉算法:

  • 102. 二叉树的层序遍历
  • 剑指 Offer 55 - I
    BFS与DFS都是图以及树中的十分基础却又十分强大的算法,熟练掌握这两个算法便已经可以解决不少leetcode中关于树和题的问题。

你可能感兴趣的:(使用广度优先算法(BFS)和深度优先算法(DFS)遍历树(Java))