二叉樹

二叉樹

二叉樹的概念

  1. 定義:每個節點最多只能有兩個子節點的一種形式稱之爲二叉樹
  2. 二叉樹的節點分爲左節點和右節點
    圖示:
    在這裏插入圖片描述
  3. 滿二叉樹:二叉樹的所有葉子節點(無分叉的節點)都在最後一層,並且總結點數爲2n- 1,n爲層數
    圖示:
    在這裏插入圖片描述
  4. 完全二叉樹:所有的葉子節點都在最後一層或者是倒數第二層,並且最後一層左邊連續,倒數第二層右邊連續。連續就是都是這一層的。
    圖示:
    在這裏插入圖片描述

二叉樹的遍歷方式

基本概念
  1. 前序遍歷:先輸出父節點,在遍歷左子樹和右子樹
  2. 中序遍歷:先遍歷左子樹,在輸出父節點,在遍歷右子樹
  3. 後序遍歷:先遍歷左子樹,再遍歷右子樹,最後輸出父節點
    ** 父節點的輸出先後決定其實遍歷的順序**
思路分析
  1. 創建一個二叉樹
  2. 遍歷:
  • 前序遍歷:
    • 輸出當前節點
    • 判斷:如果左子節點不爲空,那就繼續前序遍歷
    • 判斷:如果右子節點不爲空,那就繼續前序遍歷
  • 中序遍歷:
    • 如果當前節點的左子節點不爲空,則遞歸中序遍歷
    • 輸出當前節點
    • 如果當前節點右子節點不爲空,那就遞歸中序遍歷
  • 後序遍歷:
    • 如果當前節點的左子節點不爲空,那就遞歸左子節點
    • 如果當前節點的右子節點不爲空,那就遞歸右子節點
    • 輸出當前節點
代碼實現:
 class BinaryTree{
    //二叉樹有必須有根節點
    private HeroNode root;

    public BinaryTree(HeroNode root) {
        this.root = root;
    }

    public BinaryTree() {
    }

    //判定當前節點是否爲空
    public boolean isEmpty(){
        if (root == null){
            return false;
        }else{
            return true;
        }
    }
    //根節點爲二叉樹必需的元素,所以必須有根節點才能夠創建
    //和hashTab類似,頭應該有總覽調用各個方法,而不是由各個節點調用
    public void preOrder(){
        if (isEmpty()){
            System.out.println("當前樹爲空,無法遍歷");
        }else{
            root.preOrder();
        }
    }
    public void minOrder(){
        if (isEmpty()){
            System.out.println("當前樹爲空,無法遍歷");
        }else{
            root.midOrder();
        }
    }
    public void postOrder(){
        if (isEmpty()){
            System.out.println("當前樹爲空,無法遍歷");
        }else{
            root.postOrder();
        }
    }
}
class HeroNode{
    private int heroNo;
    private String heroName;
    HeroNode left;
    HeroNode right;

    public HeroNode(int heroNo, String heroName) {
        this.heroNo = heroNo;
        this.heroName = heroName;
    }

    public HeroNode getLeft() {
        return left;
    }

    public HeroNode getRight() {
        return right;
    }

    public void setLeft(HeroNode left) {
        this.left = left;
    }

    public void setRight(HeroNode right) {
        this.right = right;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "heroNo=" + heroNo +
                ", heroName='" + heroName + '\'' +
                '}';
    }
    public void preOrder(){
        System.out.println(this);
        if(this.left != null){
            this.left.preOrder();
        }
        if (this.right != null){
            this.right.preOrder();
        }
    }
    public void midOrder(){
        if(this.left != null){
            this.left.midOrder();
        }
        System.out.println(this);
        if (this.right != null){
            this.right.midOrder();
        }
    }
    public void postOrder(){
        if(this.left != null){
            this.left.postOrder();
        }
        if (this.right != null){
            this.right.postOrder();
        }
        System.out.println(this);
    }
分析與總結
  1. 創建節點,必須有權值,同時還有指向左右兩個子節點的索引,同時還有對應的增刪改除的方法,但是真正調用方法的還是樹結構
  2. 創建一個樹的類必須創建根節點,同時還有對於節點的操作方法,能夠操作樹的的各個節點
  3. 對於遍歷的方法而言,必須先判定是否爲空,否則會出現空指針
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章