数据结构——二叉树的遍历

二叉树最常见的遍历方式有三种,前序,中序和后序

一. 前序遍历

前序遍历就是按照根节点,左子树,右子树的顺序来遍历二叉树,在遍历左右子树的时候依然是采用前序遍历的方式

数据结构——二叉树的遍历

 

 

 

 

前序遍历的结果为:ABDECF

 

生成一棵这样的二叉树

 

//构建二叉树类
class TreeNode {
   
    char c;
    TreeNode left;
    TreeNode right;

    TreeNode(char c) {
        this.c = c;
    }
}

 

    TreeNode root3 = new TreeNode(‘A‘);
    root3.left = new TreeNode(‘B‘);
    root3.right = new TreeNode(‘C‘);
    root3.left.left = new TreeNode(‘D‘);
    root3.left.right = new TreeNode(‘E‘);
    root3.right.right = new TreeNode(‘F‘);

 

前序遍历递归代码

//递归方法前序遍历二叉树
    public static void preOrderRe(TreeNode node) {
        if(node == null)
            return;
        System.out.print(node.c + " ");
        preOrderRe(node.left);
        preOrderRe(node.right);
    }

前序遍历非递归栈代码

 //非递归栈实现前序遍历
    public static void preOrder(TreeNode node){
        if(node == null){
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(node);
        while(!stack.isEmpty()){
            //出栈和进栈
            TreeNode n = stack.pop();//弹出根结点
            //压入子结点
            System.out.print(n.val + " ");
            if(n.right!=null){
                stack.push(n.right);

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

    }

 

运行结果:

数据结构——二叉树的遍历

 

 

二. 中序遍历

中序遍历就是按照左子树,根节点,右子树的顺序来遍历二叉树,在遍历左右子树的时候依然是采用中序遍历的方式

 以上图的二叉树为例子,中序遍历的结果为:DBEACF

 //递归方法中序遍历二叉树
    public static void midOrderRe(TreeNode node) {
        if (node == null)
            return;
        midOrderRe(node.left);
        System.out.print(node.c + " ");
        midOrderRe(node.right);
    }
//非递归栈实现中序遍历
    public static void midOrder(TreeNode node){
        Stack<TreeNode> stack = new Stack<>();
        while (node != null || !stack.isEmpty()){
            while (node != null){
                stack.push(node);
                node = node.left;
            }
            if(!stack.isEmpty()){
                node = stack.pop();
                System.out.println(node.c + " ");
                node = node.right;
            }
        }

    }

运行结果:

数据结构——二叉树的遍历

 

 

 

三. 后序遍历

中序遍历就是按照左子树,右子树,根节点的顺序来遍历二叉树,在遍历左右子树的时候依然是采用后序遍历的方式

 以上图的二叉树为例子,中序遍历的结果为:DEBFAC

//递归方法后序遍历二叉树
    public static void postOrderRe(TreeNode node) {
        if (node == null)
            return;
        postOrderRe(node.left);
        postOrderRe(node.right);
        System.out.print(node.c + " ");
    }

运行结果:

数据结构——二叉树的遍历

 

 

四. 层序遍历

层序遍历二叉树就是从上到下,从左到右,一层一层地遍历二叉树

 以上图的二叉树为例子,层序遍历的结果为:ABCDEF

层序遍历可以通过队列来实现

 //层序遍历,使用队列,从上到下,从左到右
    public static void levelOrder(TreeNode node){
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.offer(node);
        while (!queue.isEmpty()){
            int size = queue.size();
            for (int i=0; i<size; i++){
                node = queue.poll();
                System.out.print(node.c + " ");
                if(node.left != null)
                    queue.offer(node.left);
                if(node.right != null)
                    queue.offer(node.right);
            }
            System.out.println();
        }
    }

运行结果:

数据结构——二叉树的遍历

 

 

数据结构——二叉树的遍历

上一篇:Grafana ES数据源 0~8h数据丢失问题


下一篇:关于 -128 的补码问题