二叉樹(哈夫曼)

特點(diǎn):結(jié)合有序組和鏈表的優(yōu)點(diǎn)

查找

public Node find(int key) {
        Node current = root;
        while(current.iData != key) {
            if(key<current.iData)
                current = current.leftChild;
            else
                current = current.rightChild;
            if(current == null) {
                return null;
            }
        }
        return current;
    }

插入:順著查找的思路,在返回前插入

public void insert(int id, double dd) {
        Node newNode = new Node();
        newNode.iData = id;
        newNode.dData = dd;
        if(root == null) {
            root = newNode;
        } else {
            Node current = root;
            Node parent;
            while(true) {
                parent = current;
                if(id < current.iData) {
                    current = current.leftChild;
                    if(current == null) {
                        parent.leftChild = newNode;
                        return;
                    }
                }else {
                    current = current.rightChild;
                    if(current == null) {
                        parent.rightChild = newNode;
                        return;
                    }
                }
            }
        }
    }

遍歷樹
中序遍歷:
1.調(diào)用自身來遍歷節(jié)點(diǎn)的左子樹
2.訪問自己節(jié)點(diǎn)
3....右子樹

private void inOrder(node localRoot) {
  if(localRoot != null) {
      inOrder(localRoot.leftChild);
      System.out.println(localRoot.iData + "");
      inOrder(localRoot.rightChild);
    }
}  

前序:
1.訪問自己節(jié)點(diǎn)
2.自身左子樹
3.自身右子樹
后序:自己想

最小值和最大值:最下最左左子樹,最下最右右子樹

刪除節(jié)點(diǎn)
三種情況:
1.該節(jié)點(diǎn)是葉節(jié)點(diǎn)(沒有子節(jié)點(diǎn))
2.該節(jié)點(diǎn)有一個(gè)子節(jié)點(diǎn)
3.該節(jié)點(diǎn)有兩個(gè)子節(jié)點(diǎn)

public boolean delete(int key) {
        Node current = root;
        Node parent = root;
        boolean isLeftChild = true;
        
        //和查找一樣
        while(current.iData != key) {
            parent = current;
            if(key<current.iData) {
                isLeftChild = true;
                current = current.leftChild;
            }
            else {
                isLeftChild = false;
                current = current.rightChild;
            }
            if(current == null) {
                return null;
            }
        }
        
        //找到之后
        //第一種情況
        if(current.leftChild == null && current.rightChild == null) {
            if(current == root)
                root = null;
            else if(isLeftChild)
                parent.leftChild = null;
            else
                parent.rightChild = null;
        }
        //第二種情況:沒有左節(jié)點(diǎn)或沒有右節(jié)點(diǎn),都要考慮被刪除節(jié)點(diǎn)可能是根
        else if(current.rightChild == null) {
            if(current == root)
                root = current.leftChild;
            else if(isLeftChild)
                parent.leftChild = current.leftChild;
            else
                parent.rightChild = current.rightChild;
        }
        else if(current.leftChild == null) {
            if(current == root)
                root = current.rightChild;
            else if(isLeftChild)
                parent.leftChild = current.leftChild;
            else
                parent.rightChild = current.rightChild;
        }
        
        
        //第三種情況:雙節(jié)點(diǎn)又分兩種情況,第一種后繼節(jié)點(diǎn)是delNode的右節(jié)點(diǎn)參考圖8.19,第二種后繼節(jié)點(diǎn)是delNode右子節(jié)點(diǎn)的左后代參考圖8.20
        Node successor = getSuccessor(current);
        
        if(current == root) 
            root = successor;
        else if(isLeftChild)
            parent.leftChild = successor;
        else
            parent.rightChild = current.leftChild;
    }
    return true;
}

//查找后繼節(jié)點(diǎn),參照?qǐng)D8.17和8.18是兩種情況
private node getSuccessor(node delNode) {
    Node SuccessorParent = delNode;
    Node successor = delNode;
    Node current = delNode.rightChild;
        //參照?qǐng)D8.17,38是需要?jiǎng)h除的節(jié)點(diǎn)
    while(current != null) {
        SuccessorParent = successor;
        successor = current;
        current = current.leftChild;
    }
    
    //參照?qǐng)D8.18,假如不等于,這兩句代碼是實(shí)現(xiàn)第二種情況的樹旋轉(zhuǎn)
    if(successor != delNode.rightChild){
        SuccessorParent.leftChild = successor.rightChild;
        successor.rightChild = delNode.rightChild;
    }
    return successor;
}
Paste_Image.png
Paste_Image.png
Paste_Image.png

哈夫曼
專用于壓縮文本

Paste_Image.png
Paste_Image.png
Paste_Image.png

重點(diǎn)解釋:用10表示S,用00表示空格后,不能再用01和11,因?yàn)樗鼈兪瞧渌址那熬Y,不夠就用三位來組合:000,001,010,011,100,110,111. A是010,I是110,因?yàn)槌?0和00開始的組合,在用四位表示其它字符,依此類推

Paste_Image.png
Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容