二叉樹的構建以及遍歷(Java語言描述)

王逍遙大人發表於2020-12-23

這篇部落格寫了二叉樹具體實現,如果沒有看過樹的基礎知識建議大家先檢視樹的基礎知識後再來看這篇文章,會更容易理解。

樹的遍歷大體分為兩類深度優先遍歷和廣度優先遍歷。而深度優先遍歷裡面又有前序中序後序遍歷,廣度優先遍歷裡面是層序遍歷。

  • 二叉樹特點定義
  1. 每個結點最多有兩個子樹,既結點度不大於2;
  2. 左樹和右樹是有有順序的,位置不能顛倒;
  3. 即使結點只有一顆子樹,也到區別左樹還是右樹;
    在這裡插入圖片描述

二叉樹儲存結構

  • 順序線性儲存:
    在這裡插入圖片描述

  • 二叉連結串列:
    在這裡插入圖片描述

二叉樹的遍歷方式

二叉樹的遍歷有前序、中序、後序遍歷。具體
二叉樹構建以及遍歷

二叉樹資料結構

  • 二叉樹的節點類
class BtNode {
    private BtNode leftChild=null;//設定值只是因為呼叫無參構造時用處
    private BtNode rightChild=null;
    private char data='a';

    public BtNode() {
    }

    public BtNode(char data) {
        this.data = data;
    }

    public BtNode(BtNode leftChild, BtNode rightChild, char data) {
        this.leftChild = leftChild;
        this.rightChild = rightChild;
        this.data = data;
    }

    public BtNode getLeftChild() {
        return leftChild;
    }

    public void setLeftChild(BtNode leftChild) {
        this.leftChild = leftChild;
    }

    public BtNode getRightChild() {
        return rightChild;
    }

    public void setRightChild(BtNode rightChild) {
        this.rightChild = rightChild;
    }

    public char getData() {
        return data;
    }

    public void setData(char data) {
        this.data = data;
    }
}
  • 二叉樹類
class BinaryTree{
    BtNode root=null; //根節點

    public BinaryTree() {
    }
   }

構建二叉樹

鍵盤輸入構建二叉樹

  • 題目描述
    用前序遍歷的思想來構建二叉樹。
    假設我們輸入下列一串前序遍歷的序列,無子節點地方輸入#,程式為我們自動構建二叉樹,並將二叉樹前序,中序,後序輸出。
ABC##DE##F##G#H##
  • 需要思考
    這裡我們想要知道,構建二叉樹最好就是輸入前序遍歷序列來構建。中序和後序序列無法用來構建二叉樹。但是後面我們還可以通過任意兩個序列來構建二叉樹。
    在這裡插入圖片描述
  • 實現程式碼
/**
     * 建立樹
     */
    public void creatTreeByPreOrder(){
        root=creatBtTree();
    }
/**
     * 根據鍵盤的輸入建立樹
     * 用先序遍歷思想進行建立二叉樹
     * @return nowNode
     */
    private BtNode creatBtTree() {
        char item;
        item=new Scanner(System.in).next().charAt(0);
        BtNode nowNode=null;
        if (item != '#'){
            nowNode=new BtNode(item);
            nowNode.setLeftChild(creatBtTree());
            nowNode.setRightChild(creatBtTree());
        }
        return nowNode;
    }
public static void main(String[] args) {

        BinaryTree binaryTree=new BinaryTree();
        binaryTree.creatTree();
        
        
        binaryTree.preOrder(binaryTree.root);
        binaryTree.middleOrder(binaryTree.root);
        binaryTree.pastOrder(binaryTree.root);
    }

二叉樹的遍歷

前序遍歷

  1. 若二叉樹為空,則退出;
  2. 否則
  3. 訪問根節點
  4. 訪問左子樹
  5. 訪問右子樹
  • 實現程式碼
/**
     * 先序遍歷
     * @param ptr
     */
    public void preOrder(BtNode ptr){
        if (ptr != null){
            System.out.print(ptr.getData());//輸出根節點
            preOrder(ptr.getLeftChild());//遞迴訪問左子樹
            preOrder(ptr.getRightChild());//遞迴訪問右子樹
        }
    }

中序遍歷

  1. 若二叉樹為空,則退出;
  2. 否則
  3. 中序遍歷左子樹
  4. 訪問根節點
  5. 中序遍歷右子樹
  • 實現程式碼
/**
     * 中序遍歷
     * @param ptr
     */
    public void middleOrder(BtNode ptr){
        if (ptr!=null){
            middleOrder(ptr.getLeftChild());
            System.out.print(ptr.getData());
            middleOrder(ptr.getRightChild());
        }
    }

後序遍歷

  1. 若二叉樹為空,則退出;
  2. 否則
  3. 訪問右子樹
  4. 訪問左子樹
  5. 訪問根節點
  • 實現程式碼
/**
     * 後序遍歷
     * @param ptr
     */
    public void pastOrder(BtNode ptr){
        if (ptr != null){
            pastOrder(ptr.getRightChild());
            pastOrder(ptr.getLeftChild());
            System.out.print(ptr.getData());
        }
    }

相關文章