树与哈夫曼树

本文深入探讨了Java实现的二叉树数据结构及其操作方法,包括中序、前序和后序遍历,以及哈夫曼树的构建与应用。详细解释了如何使用递归和迭代实现这些操作,并通过实例展示了如何创建和操作二叉树。同时,文章还介绍了哈夫曼树的原理、构建过程和在数据压缩中的应用。

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();   
    }   
}  

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 QueueForMcu 基于单片机实现的队列功能模块,主要用于8位、16位、32位非运行RTOS的单片机应用,兼容大多数单片机平台。 开源代码:https://.com/xiaoxinpro/QueueForMcu 一、特性 动态创建队列对象 动态设置队列数据缓冲区 静态指定队列元素数据长度 采用值传递的方式保存队列数据 二、快速使用 三、配置说明 目前QueueForMcu只有一个静态配置项,具体如下: 在文件 中有一个宏定义 用于指定队列元素的数据长度,默认是 ,可以根据需要更改为其他数据类型。 四、数据结构 队列的数据结构为 用于保存队列的状态,源码如下: 其中 为配置项中自定义的数据类型。 五、创建队列 1、创建队列缓存 由于我们采用值传递的方式保存队列数据,因此我们在创建队列前要手动创建一个队列缓存区,用于存放队列数据。 以上代码即创建一个大小为 的队列缓存区。 2、创建队列结构 接下来使用 创建队列结构,用于保存队列的状态: 3、初始化队列 准备好队列缓存和队列结构后调用 函数来创建队列,该函数原型如下: 参数说明: 参考代码: 六、压入队列 1、单数据压入 将数据压入队列尾部使用 函数,该函数原型如下: 参数说明: 返回值说明: 该函数会返回一个 枚举数据类型,返回值会根据队列状态返回以下几个值: 参考代码: 2、多数据压入 若需要将多个数据(数组)压入队列可以使用 函数,原理上循环调用 函数来实现的,函数原型如下: 参数说明: 当数组长度大于队列剩余长度时,数组多余的数据将被忽略。 返回值说明: 该函数将返回实际被压入到队列中的数据长度。 当队列中的剩余长度富余...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值