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

二叉树遍历

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

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

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

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

这种遍历方式可以理解为二叉树的层序遍历,即每层遍历完再去找下一层的内容,这里用图来表示更加直观:

javadfs算法 java中dfs_List


那么我们就来开始思考,这种层序遍历该怎么用代码的方式表现出来,我们可以通过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)深度优先遍历

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

javadfs算法 java中dfs_List_02


一开始看到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;
    }