Java學習筆記——二叉樹的遍歷(前序、中序、後序遍歷詳解)

一、前序、中序、後序遍歷方法

前序遍歷:先輸出父節點,在遍歷左子樹和右子樹  (根左右)

中序遍歷:先遍歷左子樹,在輸出父節點,在遍歷右子樹 (左根右)

後序遍歷:先遍歷左子樹,在遍歷右子樹,最後輸出父節點 (左右根)

(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.輸出當前節點  //能輸出時說明前面兩項均不滿足,即當前節點既沒有左節點又沒有右節點

 二、例題

根據下圖所示二叉樹,分別按照前序、中序、後序遍歷輸出該二叉樹

三、代碼實現

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);//能輸出時說明前面兩項均不滿足,即當前節點既沒有左節點又沒有右節點
    }
}

代碼邏輯框架:

   c 表示類,m表示方法,f表示成員變量

執行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章