Java学习笔记——二叉树的遍历(前序、中序、后序遍历详解)

一、前序、中序、后序遍历方法

前序遍历:先输出父节点,在遍历左子树和右子树  (根左右)

中序遍历:先遍历左子树,在输出父节点,在遍历右子树 (左根右)

后序遍历:先遍历左子树,在遍历右子树,最后输出父节点 (左右根)

Java学习笔记——二叉树的遍历(前序、中序、后序遍历详解)_第1张图片

(1)二叉树前序遍历算法思路:

准备:构建二叉树,传入某节点作为当前节点

1.先输出当前节点    //前序遍历每次先输出当前节点,在判断是否有左子树或右子树

2.if(当前节点的左孩子节点不为空)

    递归前序遍历

end

3.if(右节点不为空)  //当前节点的左孩子节点为空时,在判断是否有右孩子节点

       递归前序遍历

end

(2)二叉树中序遍历算法思路:

准备:构建二叉树,传入某节点作为当前节点

1.if(当前节点的左孩子节点不为空)

          递归中序遍历

   else

        输出当前节点   //找不到左孩子节点就可以输出当前节点了

  end

2.if(当前节点的右孩子节点不为空)/*1跟2的顺序不能换,先从左子树开始找,左子树为空时,在从最底层的右子树开始向上找*/

        递归中序遍历

   end

(3)二叉树后序遍历算法思路:

准备:构建二叉树,传入某节点作为当前节点

1.if(当前节点的左孩子节点不为空)

          递归后序遍历

  end

2.if(当前节点的右孩子节点不为空)

        递归后序遍历

   end

3.输出当前节点  //能输出时说明前面两项均不满足,即当前节点既没有左节点又没有右节点

 二、例题

根据下图所示二叉树,分别按照前序、中序、后序遍历输出该二叉树

Java学习笔记——二叉树的遍历(前序、中序、后序遍历详解)_第2张图片

三、代码实现

public class BinaryTreeDemo {
    public static void  main(String[] args)
    {
        BinaryTree binaryTree=new BinaryTree();
        //手动创建二叉树,测试
        BinaryTreeNode root=new BinaryTreeNode(1);
        BinaryTreeNode node2=new BinaryTreeNode(2);
        BinaryTreeNode node3=new BinaryTreeNode(3);
        BinaryTreeNode node4=new BinaryTreeNode(4);
        BinaryTreeNode node5=new BinaryTreeNode(5);
        BinaryTreeNode node6=new BinaryTreeNode(6);
        //有节点了,构建出二叉树
        root.setLeft(node2);
        root.setRight(node3);
        node2.setLeft(node4);
        node2.setRight(node5);
        node4.setLeft(node6);//其余节点默认为左子树或右子树为null
        //设置根节点
        binaryTree.setRoot(root);

        //测试
        System.out.println("前序遍历");
        root.preOrder();

        System.out.println("中序遍历");
        root.midOrder();

        System.out.println("后序遍历");
        root.postOrder();

    }
}
//二叉树类
class BinaryTree{
    private BinaryTreeNode root;//定义根节点
    public void setRoot(BinaryTreeNode root)
    {
        this.root=root;
    }
    //BinaryTree类前序遍历代码实现
    public void preOrder()//BinaryTree类中的preOrder方法调用了同一包下的BinaryTreeNode类中重名的preOrder()方法,下同
    {
        if(this.root!=null)
        {
            this.root.preOrder();
        }
        else
        {
            System.out.println("二叉树为空,无法遍历");
        }
    }
    //BinaryTree类的中序遍历代码实现
    public void minOrder()
    {
        if(this.root!=null)
        {
            this.root.midOrder();
        }
        else
        {
            System.out.println("二叉树为空,无法遍历");
        }
    }
    //BinaryTree类的后序遍历代码实现
    public void postOrder()
    {
        if(this.root!=null)
        {
            this.root.postOrder();
        }
        else
        {
            System.out.println("二叉树为空,无法遍历");
        }
    }
}

//二叉树节点类
class BinaryTreeNode{
    //二叉树每个节点都有三个属性:节点编号+左孩子+右孩子
    private int val;
    private BinaryTreeNode left; //默认null
    private BinaryTreeNode right; //默认null
    //有参构造方法定义
    public BinaryTreeNode(int val){
        super();
        this.val=val;
    }
    //定义成员方法
    public void setVal(int val)//1.设置二叉树节点的值
    {
        this.val=val;
    }
    public void setLeft(BinaryTreeNode left)//2.设置节点为当前节点的左孩子
    {
        this.left=left;
    }
    public void setRight(BinaryTreeNode right)//3.设置节点为当前节点的右孩子
    {
        this.right=right;
    }
    public BinaryTreeNode getLeft()// 4.无参调用,返回值为左孩子,类型为BinaryTreeNode
    {
        return left;
    }
    public BinaryTreeNode getRight()//5.无参调用,返回值为右孩子,类型为BinaryTreeNode
    {
        return right;
    }

    @Override
    public String toString()//6.改写toString方法,打印节点编号时pringln使用
    {
        return "BinaryTreeNode[val="+val+"]";
    }
    //7.前序遍历方法
    public  void  preOrder()
    {
        System.out.println(this);//先输出当前节点
        if(this.left!=null)
        {
            this.left.preOrder();
        }
        if (this.right!=null)
        {
            this.right.preOrder();
        }//栈存储? 怎么退回到上一层节点
    }
    //8.中序遍历方法
    public void midOrder()
    {
        if(this.left!=null)
        {
            this.left.midOrder();
        }
        System.out.println(this); //找不到左孩子节点就可以输出当前节点了
        if(this.right!=null)
        {
            this.right.midOrder();//先从左子树开始找,左子树为空时,在从最底层的右子树开始向上找
        }
    }
    //9.后序遍历方法
    public void postOrder()
    {
        if(this.left!=null)
        {
            this.left.postOrder();
        }
        if(this.right!=null)
        {
            this.right.postOrder();
        }
        System.out.println(this);//能输出时说明前面两项均不满足,即当前节点既没有左节点又没有右节点
    }
}

代码逻辑框架:

Java学习笔记——二叉树的遍历(前序、中序、后序遍历详解)_第3张图片   c 表示类,m表示方法,f表示成员变量

执行结果

Java学习笔记——二叉树的遍历(前序、中序、后序遍历详解)_第4张图片

你可能感兴趣的:(Java,数据结构)