`
leon_a
  • 浏览: 79049 次
  • 性别: Icon_minigender_1
  • 来自: 拜月神教
社区版块
存档分类
最新评论

树与哈夫曼树

J# 
阅读更多
package tree;   
  
public class TreeNode {   
    TreeNode llink;   
    TreeNode rlink;   
    int info;   
}  
package tree;   
  
public class Tree {   
  
    TreeNode root;   
  
    public Tree() {   
    }   
  
    public boolean isEmpty() {   
        return root == null;   
    }   
  
    // 插入   
    public void insertBinaryTree(int info) {   
        TreeNode node = new TreeNode();   
        node.info = info;   
        if (root == null) {   
            root = node;   
        } else {   
            TreeNode currentNode = root;   
            TreeNode parent;   
            while (currentNode != null) {   
                parent = currentNode;   
                if (info > currentNode.info) {   
                    currentNode = currentNode.rlink;   
                    if (currentNode == null) {   
                        parent.rlink = node;   
                    }   
                } else if (info < currentNode.info) {   
                    currentNode = currentNode.llink;   
                    if (currentNode == null) {   
                        parent.llink = node;   
                    }   
                }   
            }   
        }   
    }   
  
    // 删除   
    public void treeDelete(int info) {   
        TreeNode tNode = serach(info);   
        TreeNode deleteNode = new TreeNode();   
        TreeNode dNodeChild = new TreeNode();   
        if (tNode == null) {   
            System.out.println("node is not exists");   
        } else if (tNode.llink == null || tNode.rlink == null) {   
            deleteNode = tNode;   
        } else {   
            deleteNode = treeSuccessor(tNode);   
        }   
        if (deleteNode.llink != null) {   
            dNodeChild = deleteNode.llink;   
        } else {   
            dNodeChild = deleteNode.rlink;   
        }   
        if (getFatherNode(deleteNode) == null) {   
            root = dNodeChild;   
        } else {   
            if (deleteNode == getFatherNode(deleteNode).llink) {   
                getFatherNode(deleteNode).llink = dNodeChild;   
            } else {   
                getFatherNode(deleteNode).rlink = dNodeChild;   
            }   
        }   
        if (deleteNode != tNode) {   
            tNode.info = deleteNode.info;   
        }   
    }   
  
    // 搜索   
    public TreeNode serach(int info) {   
        return treeSerach(root, info);   
    }   
  
    // 搜索   
    public TreeNode treeSerach(TreeNode tNode, int info) {   
        if (tNode == null || tNode.info == info) {   
            return tNode;   
        }   
        if (info < tNode.info) {   
            return treeSerach(tNode.llink, info);   
        } else {   
            return treeSerach(tNode.rlink, info);   
        }   
    }   
  
    // 最大节点   
    public TreeNode treeMaxiMum(TreeNode tNode) {   
        while (tNode.rlink != null) {   
            tNode = tNode.rlink;   
        }   
        return tNode;   
    }   
  
    // 最小节点   
    public TreeNode treeMiniMun(TreeNode tNode) {   
        while (tNode.llink != null) {   
            tNode = tNode.llink;   
        }   
        return tNode;   
    }   
  
    // 找后继   
    public TreeNode treeSuccessor(TreeNode tNode) {   
        if (tNode.rlink != null) {   
            return treeMiniMun(tNode.rlink);   
        }   
        TreeNode currentNode = getFatherNode(tNode);   
        while (currentNode != null && tNode == currentNode.rlink) {   
            tNode = currentNode;   
            currentNode = getFatherNode(tNode);   
        }   
        return currentNode;   
    }   
  
    // 找前驱   
    public TreeNode treePrecursor(TreeNode tNode) {   
        if (tNode.llink != null) {   
            return treeMaxiMum(tNode.llink);   
        }   
        TreeNode currentNode = getFatherNode(tNode);   
        while (currentNode != null && tNode == currentNode.llink) {   
            tNode = currentNode;   
            currentNode = getFatherNode(tNode);   
        }   
        return currentNode;   
    }   
  
    // 找节点的父节点   
    public TreeNode getFatherNode(TreeNode tNode) {   
        TreeNode current = root;   
        TreeNode trailCurrent = null;   
        while (current != null) {   
            if (current.info == tNode.info) {   
                break;   
            }   
            trailCurrent = current;   
            if (tNode.info < current.info) {   
                current = current.llink;   
            } else {   
                current = current.rlink;   
            }   
        }   
        return trailCurrent;   
    }   
  
    // 中序遍历   
    public void inOrder(TreeNode tNode) {   
        if (tNode != null) {   
            inOrder(tNode.llink);   
            System.out.print(tNode.info + " ");   
            inOrder(tNode.rlink);   
        }   
    }   
  
    // 打印树   
    public void printTree() {   
        System.out.println("inOrder");   
        inOrder(root);   
        System.out.println();   
        System.out.println("preOrder");   
        preOrder(root);   
        System.out.println();   
        System.out.println("postOrder");   
        postOrder(root);   
        System.out.println();   
    }   
  
    // 前序遍历   
    public void preOrder(TreeNode tNode) {   
        if (tNode != null) {   
            System.out.print(tNode.info + " ");   
            preOrder(tNode.llink);   
            preOrder(tNode.rlink);   
        }   
    }   
  
    // 后序遍历   
    public void postOrder(TreeNode tNode) {   
        if (tNode != null) {   
            postOrder(tNode.llink);   
            postOrder(tNode.rlink);   
            System.out.print(tNode.info + " ");   
        }   
    }   
  
    public static void main(String[] args) {   
        Tree tree = new Tree();   
        System.out.println("insert tree start");   
        tree.insertBinaryTree(15);   
        tree.insertBinaryTree(5);   
        tree.insertBinaryTree(16);   
        tree.insertBinaryTree(3);   
        tree.insertBinaryTree(12);   
        tree.insertBinaryTree(20);   
        tree.insertBinaryTree(10);   
        tree.insertBinaryTree(13);   
        tree.insertBinaryTree(18);   
        tree.insertBinaryTree(23);   
        tree.insertBinaryTree(6);   
        tree.insertBinaryTree(7);   
        System.out.println("insert tree end");   
        System.out.println("print tree start");   
        tree.treeDelete(15);   
        tree.printTree();   
        System.out.println("print tree end");   
  
    }   
}     


哈夫曼树
package tree;   
  
/**  
 * @author B.Chen  
 */  
public class HuffmanTree {   
  
    /**  
     * 根节点  
     */  
    public TreeNode root;   
  
    /**  
     * 数组下表  
     */  
    public int nodeSize;   
  
    /**  
     * 长度  
     */  
    public int length;   
  
    /**  
     * 哈夫曼节点数组  
     */  
    public TreeNode[] nodeList;   
       
    /**  
     * 访问控制  
     */  
    public boolean[] visited;   
  
    /**  
     * @param length  
     */  
    public HuffmanTree(int length) {   
        this.length = length;   
        nodeList = new TreeNode[2 * length-1];   
        visited = new boolean[2*length-1];   
    }   
  
    /**  
     * @param info  
     */  
    public void addNode(int info) {   
        TreeNode tNode = new TreeNode();   
        tNode.info = info;   
        if (nodeSize < length) {   
            nodeList[nodeSize++] = tNode;   
        } else {   
            System.out.println("out of size");   
        }   
    }   
       
    /**  
     * 构造哈夫曼树  
     */  
    public void createHuffmanTree() {   
        int j = length;   
        while (nodeList[2*length -2] == null) {   
            TreeNode lNode = getMiniMumNode();   
            TreeNode rNode = getMiniMumNode();   
            TreeNode tNode = new TreeNode();   
            System.out.println(lNode.info + " " + rNode.info);   
            tNode.llink = lNode;   
            tNode.rlink = rNode;   
            tNode.info = lNode.info + rNode.info;   
            nodeList[j++] = tNode;   
        }   
        root = nodeList[2 * length - 2];   
    }   
       
    /**  
     * @return TreeNode  
     */  
    public TreeNode getMiniMumNode() {   
        TreeNode tNode = null;   
        int size = 0;   
        for(int i=0;i<2*length-1;i++) {   
            if(!visited[i] && nodeList[i] != null) {   
                tNode = nodeList[i];   
                size = i;   
                for(int j=0;j<2*length-1;j++) {   
                    if(!visited[j] && nodeList[j] != null) {   
                        if(tNode.info > nodeList[j].info) {   
                            tNode = nodeList[j];   
                            size = j;   
                        }   
                    }   
                }   
            }   
        }   
        visited[size] = true;   
        return tNode;   
    }   
       
    /**  
     * 中序遍历  
     *   
     * @param tNode  
     */  
    public void inOrder(TreeNode tNode) {   
        if (tNode != null) {   
            inOrder(tNode.llink);   
            System.out.print(tNode.info + " ");   
            inOrder(tNode.rlink);   
        }   
    }   
       
    /**  
     * 打印  
     */  
    public void printHuffmanTree() {   
        System.out.println("inOrder");   
        inOrder(root);   
    }   
       
    /**  
     * @param args  
     */  
    public static void main(String[] args) {   
        HuffmanTree hTree = new HuffmanTree(6);   
        hTree.addNode(4);   
        hTree.addNode(4);   
        hTree.addNode(4);   
        hTree.addNode(4);   
        hTree.addNode(5);   
        hTree.addNode(6);   
        hTree.createHuffmanTree();   
        hTree.printHuffmanTree();   
    }   
}  

分享到:
评论

相关推荐

    哈夫曼树与哈夫曼编码

    哈夫曼树与哈夫曼编码是数据结构和算法领域中的一个重要概念,广泛应用于数据压缩、文本编码以及优先队列等场景。哈夫曼编码是一种特殊的前缀编码方法,能够为字符提供一种高效的二进制表示,使得频繁出现的字符具有...

    武汉大学程序艺术课件----树与哈夫曼树.ppt

    武汉大学程序艺术课件----树与哈夫曼树.ppt

    数据结构实验-哈夫曼树与哈夫曼编码

    运用哈夫曼算法构造哈夫曼树,并得到哈夫曼编码。 输入格式:10,5,21,18,8,13 二、实验目的 掌握哈夫曼算法。 三、实验内容及要求 1、构造哈夫曼树和哈夫曼编码的存储结构。 2、实现哈夫曼算法,实现哈夫曼树的存储...

    哈夫曼树及哈夫曼编码数据结构实验报告

    哈夫曼树是一种特殊的二叉树,用于解决数据编码和压缩问题,特别是在数据通信和文件压缩领域广泛应用。哈夫曼编码是一种高效的前缀编码方法,它根据数据出现频率分配最短的二进制码,频繁出现的字符拥有较短的编码,...

    C++ 二叉排序树及查找哈夫曼树与哈夫曼编码 括号匹配检验

    本话题将深入探讨C++中实现的几个关键数据结构及其应用:二叉排序树(Binary Search Tree, BST)、哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman Coding),以及括号匹配检验,这些都是基于栈(Stack)的应用。...

    哈夫曼树和哈夫曼编码的实现

    "哈夫曼树和哈夫曼编码的实现" 哈夫曼树是一种高效的编码树结构,它广泛应用于数据压缩、编码等领域。哈夫曼编码是一种变长前缀编码方法,它可以将符号编码成二进制代码,以达到压缩数据的目的。 哈夫曼树的构建...

    建哈夫曼树 实现哈夫曼编码

    哈夫曼树(Huffman Tree)和哈夫曼编码(Huffman Coding)是数据压缩领域中的基础算法,它们主要用于无损数据...通过理解和实现哈夫曼树与哈夫曼编码,我们可以深入理解数据压缩的原理,并能设计出更高效的压缩算法。

    C++实现哈夫曼树及哈夫曼编码.rar

    哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman Coding)是数据压缩领域中的重要算法,它们主要用于无损数据压缩。哈夫曼编码是一种前缀编码方法,通过构建最优二叉树来实现字符的高效编码,使得常用字符的编码长度...

    哈夫曼树和哈夫曼编码

    #### 一、哈夫曼树与哈夫曼编码概念 **哈夫曼树**是一种特殊的二叉树,也被称为最优二叉树,它是一类带权路径长度最短的二叉树。这种树常用于构建高效的编码方案,比如哈夫曼编码,它可以用来压缩数据。 **哈夫曼...

    哈夫曼树与哈夫曼编码.txt

    ### 哈夫曼树与哈夫曼编码 #### 哈夫曼树的基本概念 哈夫曼树,又称作最优二叉树,是一种特殊的二叉树结构,在数据压缩领域有着重要的应用价值。它主要用于构建一种高效的数据压缩模型,通过减少数据传输或存储时...

    哈夫曼树与哈夫曼编码介绍.zip

    哈夫曼树与哈夫曼编码是数据结构和算法领域中的重要概念,主要应用于数据压缩和效率优化。它们是基于贪心策略的高效算法,旨在最小化带权路径长度(WPL),从而达到最佳编码的效果。 哈夫曼树,又称为最优二叉树或...

    实验报告 哈夫曼树及哈夫曼编码

    哈夫曼树是一种特殊的二叉树,用于实现数据的高效编码,特别适用于数据压缩和通信领域。它由赫尔曼·哈夫曼在1952年提出,因此得名哈夫曼编码。哈夫曼编码是通过构建一棵最优二叉树来实现的,这棵树的特性是:频率越...

    哈夫曼树与哈夫曼编码zip

    哈夫曼树与哈夫曼编码是数据压缩领域中的核心概念,它们在计算机科学和信息技术中扮演着重要的角色。哈夫曼编码是一种高效的前缀编码方法,常用于无损数据压缩,以减少数据存储和传输的位数。下面将详细阐述这两个...

    用哈夫曼树实现哈夫曼编码

    小小的实验,用哈夫曼树实现哈夫曼编码,属于cpp文件,

    数据结构实验二哈夫曼树及哈夫曼编码译码的实现

    哈夫曼树及哈夫曼编码译码的实现 哈夫曼树是一种特殊的二叉树,它的每个节点的权重是其所有子节点的权重之和。哈夫曼树的应用非常广泛,如数据压缩、编码、译码等。 哈夫曼树的存储结构 哈夫曼树的存储结构可以...

Global site tag (gtag.js) - Google Analytics