二叉樹查詢,遍歷代碼實現

 

二叉樹的概念

  • 1)如果該二叉樹的所有子節點都在最後一層,並且點總數= 2^n -1 , n 爲層數,則我們稱爲滿二叉樹。
  • 2)果該二叉樹的所有葉子節點都在最後一層或者倒數第二層,而且最後一層的葉子節點在左邊連續,倒數第二層的葉子節點在右邊連續,我們稱爲完全二叉樹。

二叉樹遍歷

前序遍歷: 先輸出父節點,再遍歷左子樹和右子樹

序遍歷: 先遍歷左子樹,再輸出父節點,再遍歷右子樹

序遍歷: 先遍歷左子樹,再遍歷右子樹,最後輸出父節點

小結: 看輸出父節點的順序,就確定是前序,中序還是後序

思路:

前序遍歷

//編寫前序遍歷的方法
    public void preOrder() {
        System.out.println(this); //先輸出父結點
        //遞歸向左子樹前序遍歷
        if(this.left != null) {
            this.left.preOrder();
        }
        //遞歸向右子樹前序遍歷
        if(this.right != null) {
            this.right.preOrder();
        }
    }

中序遍歷 

//中序遍歷
    public void infixOrder() {

        //遞歸向左子樹中序遍歷
        if(this.left != null) {
            this.left.infixOrder();
        }
        //輸出父結點
        System.out.println(this);
        //遞歸向右子樹中序遍歷
        if(this.right != null) {
            this.right.infixOrder();
        }
    }

後續遍歷

//後序遍歷
    public void postOrder() {
        if(this.left != null) {
            this.left.postOrder();
        }
        if(this.right != null) {
            this.right.postOrder();
        }
        System.out.println(this);
    }

二叉樹查找思路分析

 

public HeroNode preOrderSearch(int no) {
        System.out.println("進入前序遍歷");
        //比較當前結點是不是
        if(this.no == no) {
            return this;
        }
        //1.則判斷當前結點的左子節點是否爲空,如果不爲空,則遞歸前序查找
        //2.如果左遞歸前序查找,找到結點,則返回
        HeroNode resNode = null;
        if(this.left != null) {
            resNode = this.left.preOrderSearch(no);
        }
        if(resNode != null) {//說明我們左子樹找到
            return resNode;
        }
        //1.左遞歸前序查找,找到結點,則返回,否繼續判斷,
        //2.當前的結點的右子節點是否爲空,如果不空,則繼續向右遞歸前序查找
        if(this.right != null) {
            resNode = this.right.preOrderSearch(no);
        }
        return resNode;
    }

 刪除結點思路

 

   思路

  •             1. 因爲我們的二叉樹是單向的,所以我們是判斷當前結點的子結點是否需要刪除結點,而不能去判斷當前這個結點  是不是需要刪除結點.
  •             2. 如果當前結點的左子結點不爲空,並且左子結點 就是要刪除結點,就將this.left = null; 並且就返回(結束遞歸刪除)
  •             3. 如果當前結點的右子結點不爲空,並且右子結點 就是要刪除結點,就將this.right= null ;並且就返回(結束遞歸刪除)
  •             4. 如果第2和第3步沒有刪除結點,那麼我們就需要向左子樹進行遞歸刪除
  •             5.  如果第4步也沒有刪除結點,則應當向右子樹進行遞歸刪除.

         

 

 public void delNode(int no) {

        //2. 如果當前結點的左子結點不爲空,並且左子結點 就是要刪除結點,就將this.left = null; 並且就返回(結束遞歸刪除)
        if(this.left != null && this.left.no == no) {
            this.left = null;
            return;
        }
        //3.如果當前結點的右子結點不爲空,並且右子結點 就是要刪除結點,就將this.right= null ;並且就返回(結束遞歸刪除)
        if(this.right != null && this.right.no == no) {
            this.right = null;
            return;
        }
        //4.我們就需要向左子樹進行遞歸刪除
        if(this.left != null) {
            this.left.delNode(no);
        }
        //5.則應當向右子樹進行遞歸刪除
        if(this.right != null) {
            this.right.delNode(no);
        }
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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