<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>xiaoqiu369</title>
    <description></description>
    <link>http://xiaoqiu369.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>数据结构java的实现</title>
        <author>xiaoqiu369</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xiaoqiu369.javaeye.com">xiaoqiu369</a>&nbsp;
          链接：<a href="http://xiaoqiu369.javaeye.com/blog/215817" style="color:red;">http://xiaoqiu369.javaeye.com/blog/215817</a>&nbsp;
          发表时间: 2008年07月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自:http://bea.javaeye.com/blog/166347<br />不知道为什么copy下来发布不完整.<br />1 树与哈夫曼树 <br /><br /><br />Java代码 <br />package tree;      <br />     <br />public class TreeNode {      <br />    TreeNode llink;      <br />    TreeNode rlink;      <br />    int info;      <br />}     <br />package tree;      <br />     <br />public class Tree {      <br />     <br />    TreeNode root;      <br />     <br />    public Tree() {      <br />    }      <br />     <br />    public boolean isEmpty() {      <br />        return root == null;      <br />    }      <br />     <br />    // 插入      <br />    public void insertBinaryTree(int info) {      <br />        TreeNode node = new TreeNode();      <br />        node.info = info;      <br />        if (root == null) {      <br />            root = node;      <br />        } else {      <br />            TreeNode currentNode = root;      <br />            TreeNode parent;      <br />            while (currentNode != null) {      <br />                parent = currentNode;      <br />                if (info > currentNode.info) {      <br />                    currentNode = currentNode.rlink;      <br />                    if (currentNode == null) {      <br />                        parent.rlink = node;      <br />                    }      <br />                } else if (info &lt; currentNode.info) {      <br />                    currentNode = currentNode.llink;      <br />                    if (currentNode == null) {      <br />                        parent.llink = node;      <br />                    }      <br />                }      <br />            }      <br />        }      <br />    }      <br />     <br />    // 删除      <br />    public void treeDelete(int info) {      <br />        TreeNode tNode = serach(info);      <br />        TreeNode deleteNode = new TreeNode();      <br />        TreeNode dNodeChild = new TreeNode();      <br />        if (tNode == null) {      <br />            System.out.println("node is not exists");      <br />        } else if (tNode.llink == null || tNode.rlink == null) {      <br />            deleteNode = tNode;      <br />        } else {      <br />            deleteNode = treeSuccessor(tNode);      <br />        }      <br />        if (deleteNode.llink != null) {      <br />            dNodeChild = deleteNode.llink;      <br />        } else {      <br />            dNodeChild = deleteNode.rlink;      <br />        }      <br />        if (getFatherNode(deleteNode) == null) {      <br />            root = dNodeChild;      <br />        } else {      <br />            if (deleteNode == getFatherNode(deleteNode).llink) {      <br />                getFatherNode(deleteNode).llink = dNodeChild;      <br />            } else {      <br />                getFatherNode(deleteNode).rlink = dNodeChild;      <br />            }      <br />        }      <br />        if (deleteNode != tNode) {      <br />            tNode.info = deleteNode.info;      <br />        }      <br />    }      <br />     <br />    // 搜索      <br />    public TreeNode serach(int info) {      <br />        return treeSerach(root, info);      <br />    }      <br />     <br />    // 搜索      <br />    public TreeNode treeSerach(TreeNode tNode, int info) {      <br />        if (tNode == null || tNode.info == info) {      <br />            return tNode;      <br />        }      <br />        if (info &lt; tNode.info) {      <br />            return treeSerach(tNode.llink, info);      <br />        } else {      <br />            return treeSerach(tNode.rlink, info);      <br />        }      <br />    }      <br />     <br />    // 最大节点      <br />    public TreeNode treeMaxiMum(TreeNode tNode) {      <br />        while (tNode.rlink != null) {      <br />            tNode = tNode.rlink;      <br />        }      <br />        return tNode;      <br />    }      <br />     <br />    // 最小节点      <br />    public TreeNode treeMiniMun(TreeNode tNode) {      <br />        while (tNode.llink != null) {      <br />            tNode = tNode.llink;      <br />        }      <br />        return tNode;      <br />    }      <br />     <br />    // 找后继      <br />    public TreeNode treeSuccessor(TreeNode tNode) {      <br />        if (tNode.rlink != null) {      <br />            return treeMiniMun(tNode.rlink);      <br />        }      <br />        TreeNode currentNode = getFatherNode(tNode);      <br />        while (currentNode != null && tNode == currentNode.rlink) {      <br />            tNode = currentNode;      <br />            currentNode = getFatherNode(tNode);      <br />        }      <br />        return currentNode;      <br />    }      <br />     <br />    // 找前驱      <br />    public TreeNode treePrecursor(TreeNode tNode) {      <br />        if (tNode.llink != null) {      <br />            return treeMaxiMum(tNode.llink);      <br />        }      <br />        TreeNode currentNode = getFatherNode(tNode);      <br />        while (currentNode != null && tNode == currentNode.llink) {      <br />            tNode = currentNode;      <br />            currentNode = getFatherNode(tNode);      <br />        }      <br />        return currentNode;      <br />    }      <br />     <br />    // 找节点的父节点      <br />    public TreeNode getFatherNode(TreeNode tNode) {      <br />        TreeNode current = root;      <br />        TreeNode trailCurrent = null;      <br />        while (current != null) {      <br />            if (current.info == tNode.info) {      <br />                break;      <br />            }      <br />            trailCurrent = current;      <br />            if (tNode.info &lt; current.info) {      <br />                current = current.llink;      <br />            } else {      <br />                current = current.rlink;      <br />            }      <br />        }      <br />        return trailCurrent;      <br />    }      <br />     <br />    // 中序遍历      <br />    public void inOrder(TreeNode tNode) {      <br />        if (tNode != null) {      <br />            inOrder(tNode.llink);      <br />            System.out.print(tNode.info + " ");      <br />            inOrder(tNode.rlink);      <br />        }      <br />    }      <br />     <br />    // 打印树      <br />    public void printTree() {      <br />        System.out.println("inOrder");      <br />        inOrder(root);      <br />        System.out.println();      <br />        System.out.println("preOrder");      <br />        preOrder(root);      <br />        System.out.println();      <br />        System.out.println("postOrder");      <br />        postOrder(root);      <br />        System.out.println();      <br />    }      <br />     <br />    // 前序遍历      <br />    public void preOrder(TreeNode tNode) {      <br />        if (tNode != null) {      <br />            System.out.print(tNode.info + " ");      <br />            preOrder(tNode.llink);      <br />            preOrder(tNode.rlink);      <br />        }      <br />    }      <br />     <br />    // 后序遍历      <br />    public void postOrder(TreeNode tNode) {      <br />        if (tNode != null) {      <br />            postOrder(tNode.llink);      <br />            postOrder(tNode.rlink);      <br />            System.out.print(tNode.info + " ");      <br />        }      <br />    }      <br />     <br />    public static void main(String[] args) {      <br />        Tree tree = new Tree();      <br />        System.out.println("insert tree start");      <br />        tree.insertBinaryTree(15);      <br />        tree.insertBinaryTree(5);      <br />        tree.insertBinaryTree(16);      <br />        tree.insertBinaryTree(3);      <br />        tree.insertBinaryTree(12);      <br />        tree.insertBinaryTree(20);      <br />        tree.insertBinaryTree(10);      <br />        tree.insertBinaryTree(13);      <br />        tree.insertBinaryTree(18);      <br />        tree.insertBinaryTree(23);      <br />        tree.insertBinaryTree(6);      <br />        tree.insertBinaryTree(7);      <br />        System.out.println("insert tree end");      <br />        System.out.println("print tree start");      <br />        tree.treeDelete(15);      <br />        tree.printTree();      <br />        System.out.println("print tree end");      <br />     <br />    }      <br />}       <br /><br />package tree;   <br />  <br />public class TreeNode {   <br />    TreeNode llink;   <br />    TreeNode rlink;   <br />    int info;   <br />}  <br />package tree;   <br />  <br />public class Tree {   <br />  <br />    TreeNode root;   <br />  <br />    public Tree() {   <br />    }   <br />  <br />    public boolean isEmpty() {   <br />        return root == null;   <br />    }   <br />  <br />    // 插入   <br />    public void insertBinaryTree(int info) {   <br />        TreeNode node = new TreeNode();   <br />        node.info = info;   <br />        if (root == null) {   <br />            root = node;   <br />        } else {   <br />            TreeNode currentNode = root;   <br />            TreeNode parent;   <br />            while (currentNode != null) {   <br />                parent = currentNode;   <br />                if (info > currentNode.info) {   <br />                    currentNode = currentNode.rlink;   <br />                    if (currentNode == null) {   <br />                        parent.rlink = node;   <br />                    }   <br />                } else if (info &lt; currentNode.info) {   <br />                    currentNode = currentNode.llink;   <br />                    if (currentNode == null) {   <br />                        parent.llink = node;   <br />                    }   <br />                }   <br />            }   <br />        }   <br />    }   <br />  <br />    // 删除   <br />    public void treeDelete(int info) {   <br />        TreeNode tNode = serach(info);   <br />        TreeNode deleteNode = new TreeNode();   <br />        TreeNode dNodeChild = new TreeNode();   <br />        if (tNode == null) {   <br />            System.out.println("node is not exists");   <br />        } else if (tNode.llink == null || tNode.rlink == null) {   <br />            deleteNode = tNode;   <br />        } else {   <br />            deleteNode = treeSuccessor(tNode);   <br />        }   <br />        if (deleteNode.llink != null) {   <br />            dNodeChild = deleteNode.llink;   <br />        } else {   <br />            dNodeChild = deleteNode.rlink;   <br />        }   <br />        if (getFatherNode(deleteNode) == null) {   <br />            root = dNodeChild;   <br />        } else {   <br />            if (deleteNode == getFatherNode(deleteNode).llink) {   <br />                getFatherNode(deleteNode).llink = dNodeChild;   <br />            } else {   <br />                getFatherNode(deleteNode).rlink = dNodeChild;   <br />            }   <br />        }   <br />        if (deleteNode != tNode) {   <br />            tNode.info = deleteNode.info;   <br />        }   <br />    }   <br />  <br />    // 搜索   <br />    public TreeNode serach(int info) {   <br />        return treeSerach(root, info);   <br />    }   <br />  <br />    // 搜索   <br />    public TreeNode treeSerach(TreeNode tNode, int info) {   <br />        if (tNode == null || tNode.info == info) {   <br />            return tNode;   <br />        }   <br />        if (info &lt; tNode.info) {   <br />            return treeSerach(tNode.llink, info);   <br />        } else {   <br />            return treeSerach(tNode.rlink, info);   <br />        }   <br />    }   <br />  <br />    // 最大节点   <br />    public TreeNode treeMaxiMum(TreeNode tNode) {   <br />        while (tNode.rlink != null) {   <br />            tNode = tNode.rlink;   <br />        }   <br />        return tNode;   <br />    }   <br />  <br />    // 最小节点   <br />    public TreeNode treeMiniMun(TreeNode tNode) {   <br />        while (tNode.llink != null) {   <br />            tNode = tNode.llink;   <br />        }   <br />        return tNode;   <br />    }   <br />  <br />    // 找后继   <br />    public TreeNode treeSuccessor(TreeNode tNode) {   <br />        if (tNode.rlink != null) {   <br />            return treeMiniMun(tNode.rlink);   <br />        }   <br />        TreeNode currentNode = getFatherNode(tNode);   <br />        while (currentNode != null && tNode == currentNode.rlink) {   <br />            tNode = currentNode;   <br />            currentNode = getFatherNode(tNode);   <br />        }   <br />        return currentNode;   <br />    }   <br />  <br />    // 找前驱   <br />    public TreeNode treePrecursor(TreeNode tNode) {   <br />        if (tNode.llink != null) {   <br />            return treeMaxiMum(tNode.llink);   <br />        }   <br />        TreeNode currentNode = getFatherNode(tNode);   <br />        while (currentNode != null && tNode == currentNode.llink) {   <br />            tNode = currentNode;   <br />            currentNode = getFatherNode(tNode);   <br />        }   <br />        return currentNode;   <br />    }   <br />  <br />    // 找节点的父节点   <br />    public TreeNode getFatherNode(TreeNode tNode) {   <br />        TreeNode current = root;   <br />        TreeNode trailCurrent = null;   <br />        while (current != null) {   <br />            if (current.info == tNode.info) {   <br />                break;   <br />            }   <br />            trailCurrent = current;   <br />            if (tNode.info &lt; current.info) {   <br />                current = current.llink;   <br />            } else {   <br />                current = current.rlink;   <br />            }   <br />        }   <br />        return trailCurrent;   <br />    }   <br />  <br />    // 中序遍历   <br />    public void inOrder(TreeNode tNode) {   <br />        if (tNode != null) {   <br />            inOrder(tNode.llink);   <br />            System.out.print(tNode.info + " ");   <br />            inOrder(tNode.rlink);   <br />        }   <br />    }   <br />  <br />    // 打印树   <br />    public void printTree() {   <br />        System.out.println("inOrder");   <br />        inOrder(root);   <br />        System.out.println();   <br />        System.out.println("preOrder");   <br />        preOrder(root);   <br />        System.out.println();   <br />        System.out.println("postOrder");   <br />        postOrder(root);   <br />        System.out.println();   <br />    }   <br />  <br />    // 前序遍历   <br />    public void preOrder(TreeNode tNode) {   <br />        if (tNode != null) {   <br />            System.out.print(tNode.info + " ");   <br />            preOrder(tNode.llink);   <br />            preOrder(tNode.rlink);   <br />        }   <br />    }   <br />  <br />    // 后序遍历   <br />    public void postOrder(TreeNode tNode) {   <br />        if (tNode != null) {   <br />            postOrder(tNode.llink);   <br />            postOrder(tNode.rlink);   <br />            System.out.print(tNode.info + " ");   <br />        }   <br />    }   <br />  <br />    public static void main(String[] args) {   <br />        Tree tree = new Tree();   <br />        System.out.println("insert tree start");   <br />        tree.insertBinaryTree(15);   <br />        tree.insertBinaryTree(5);   <br />        tree.insertBinaryTree(16);   <br />        tree.insertBinaryTree(3);   <br />        tree.insertBinaryTree(12);   <br />        tree.insertBinaryTree(20);   <br />        tree.insertBinaryTree(10);   <br />        tree.insertBinaryTree(13);   <br />        tree.insertBinaryTree(18);   <br />        tree.insertBinaryTree(23);   <br />        tree.insertBinaryTree(6);   <br />        tree.insertBinaryTree(7);   <br />        System.out.println("insert tree end");   <br />        System.out.println("print tree start");   <br />        tree.treeDelete(15);   <br />        tree.printTree();   <br />        System.out.println("print tree end");   <br />  <br />    }   <br />}     <br /><br /><br />Java代码 <br />package tree;      <br />     <br />/**    <br /> * @author B.Chen    <br /> */     <br />public class HuffmanTree {      <br />     <br />    /**    <br />     * 根节点    <br />     */     <br />    public TreeNode root;      <br />     <br />    /**    <br />     * 数组下表    <br />     */     <br />    public int nodeSize;      <br />     <br />    /**    <br />     * 长度    <br />     */     <br />    public int length;      <br />     <br />    /**    <br />     * 哈夫曼节点数组    <br />     */     <br />    public TreeNode[] nodeList;      <br />          <br />    /**    <br />     * 访问控制    <br />     */     <br />    public boolean[] visited;      <br />     <br />    /**    <br />     * @param length    <br />     */     <br />    public HuffmanTree(int length) {      <br />        this.length = length;      <br />        nodeList = new TreeNode[2 * length-1];      <br />        visited = new boolean[2*length-1];      <br />    }      <br />     <br />    /**    <br />     * @param info    <br />     */     <br />    public void addNode(int info) {      <br />        TreeNode tNode = new TreeNode();      <br />        tNode.info = info;      <br />        if (nodeSize &lt; length) {      <br />            nodeList[nodeSize++] = tNode;      <br />        } else {      <br />            System.out.println("out of size");      <br />        }      <br />    }      <br />          <br />    /**    <br />     * 构造哈夫曼树    <br />     */     <br />    public void createHuffmanTree() {      <br />        int j = length;      <br />        while (nodeList[2*length -2] == null) {      <br />            TreeNode lNode = getMiniMumNode();      <br />            TreeNode rNode = getMiniMumNode();      <br />            TreeNode tNode = new TreeNode();      <br />            System.out.println(lNode.info + " " + rNode.info);      <br />            tNode.llink = lNode;      <br />            tNode.rlink = rNode;      <br />            tNode.info = lNode.info + rNode.info;      <br />            nodeList[j++] = tNode;      <br />        }      <br />        root = nodeList[2 * length - 2];      <br />    }      <br />          <br />    /**    <br />     * @return TreeNode    <br />     */     <br />    public TreeNode getMiniMumNode() {      <br />        TreeNode tNode = null;      <br />        int size = 0;      <br />        for(int i=0;i&lt;2*length-1;i++) {      <br />            if(!visited[i] && nodeList[i] != null) {      <br />                tNode = nodeList[i];      <br />                size = i;      <br />                for(int j=0;j&lt;2*length-1;j++) {      <br />                    if(!visited[j] && nodeList[j] != null) {      <br />                        if(tNode.info > nodeList[j].info) {      <br />                            tNode = nodeList[j];      <br />                            size = j;      <br />                        }      <br />                    }      <br />                }      <br />            }      <br />        }      <br />        visited[size] = true;      <br />        return tNode;      <br />    }      <br />          <br />    /**    <br />     * 中序遍历    <br />     *     <br />     * @param tNode    <br />     */     <br />    public void inOrder(TreeNode tNode) {      <br />        if (tNode != null) {      <br />            inOrder(tNode.llink);      <br />            System.out.print(tNode.info + " ");      <br />            inOrder(tNode.rlink);      <br />        }      <br />    }      <br />          <br />    /**    <br />     * 打印    <br />     */     <br />    public void printHuffmanTree() {      <br />        System.out.println("inOrder");      <br />        inOrder(root);      <br />    }      <br />          <br />    /**    <br />     * @param args    <br />     */     <br />    public static void main(String[] args) {      <br />        HuffmanTree hTree = new HuffmanTree(6);      <br />        hTree.addNode(4);      <br />        hTree.addNode(4);      <br />        hTree.addNode(4);      <br />        hTree.addNode(4);      <br />        hTree.addNode(5);      <br />        hTree.addNode(6);      <br />        hTree.createHuffmanTree();      <br />        hTree.printHuffmanTree();      <br />    }      <br />}    <br /><br />package tree;   <br />  <br />/**  <br /> * @author B.Chen  <br /> */  <br />public class HuffmanTree {   <br />  <br />    /**  <br />     * 根节点  <br />     */  <br />    public TreeNode root;   <br />  <br />    /**  <br />     * 数组下表  <br />     */  <br />    public int nodeSize;   <br />  <br />    /**  <br />     * 长度  <br />     */  <br />    public int length;   <br />  <br />    /**  <br />     * 哈夫曼节点数组  <br />     */  <br />    public TreeNode[] nodeList;   <br />       <br />    /**  <br />     * 访问控制  <br />     */  <br />    public boolean[] visited;   <br />  <br />    /**  <br />     * @param length  <br />     */  <br />    public HuffmanTree(int length) {   <br />        this.length = length;   <br />        nodeList = new TreeNode[2 * length-1];   <br />        visited = new boolean[2*length-1];   <br />    }   <br />  <br />    /**  <br />     * @param info  <br />     */  <br />    public void addNode(int info) {   <br />        TreeNode tNode = new TreeNode();   <br />        tNode.info = info;   <br />        if (nodeSize &lt; length) {   <br />            nodeList[nodeSize++] = tNode;   <br />        } else {   <br />            System.out.println("out of size");   <br />        }   <br />    }   <br />       <br />    /**  <br />     * 构造哈夫曼树  <br />     */  <br />    public void createHuffmanTree() {   <br />        int j = length;   <br />        while (nodeList[2*length -2] == null) {   <br />            TreeNode lNode = getMiniMumNode();   <br />            TreeNode rNode = getMiniMumNode();   <br />            TreeNode tNode = new TreeNode();   <br />            System.out.println(lNode.info + " " + rNode.info);   <br />            tNode.llink = lNode;   <br />            tNode.rlink = rNode;   <br />            tNode.info = lNode.info + rNode.info;   <br />            nodeList[j++] = tNode;   <br />        }   <br />        root = nodeList[2 * length - 2];   <br />    }   <br />       <br />    /**  <br />     * @return TreeNode  <br />     */  <br />    public TreeNode getMiniMumNode() {   <br />        TreeNode tNode = null;   <br />        int size = 0;   <br />        for(int i=0;i&lt;2*length-1;i++) {   <br />            if(!visited[i] && nodeList[i] != null) {   <br />                tNode = nodeList[i];   <br />                size = i;   <br />                for(int j=0;j&lt;2*length-1;j++) {   <br />                    if(!visited[j] && nodeList[j] != null) {   <br />                        if(tNode.info > nodeList[j].info) {   <br />                            tNode = nodeList[j];   <br />                            size = j;   <br />                        }   <br />                    }   <br />                }   <br />            }   <br />        }   <br />        visited[size] = true;   <br />        return tNode;   <br />    }   <br />       <br />    /**  <br />     * 中序遍历  <br />     *   <br />     * @param tNode  <br />     */  <br />    public void inOrder(TreeNode tNode) {   <br />        if (tNode != null) {   <br />            inOrder(tNode.llink);   <br />            System.out.print(tNode.info + " ");   <br />            inOrder(tNode.rlink);   <br />        }   <br />    }   <br />       <br />    /**  <br />     * 打印  <br />     */  <br />    public void printHuffmanTree() {   <br />        System.out.println("inOrder");   <br />        inOrder(root);   <br />    }   <br />       <br />    /**  <br />     * @param args  <br />     */  <br />    public static void main(String[] args) {   <br />        HuffmanTree hTree = new HuffmanTree(6);   <br />        hTree.addNode(4);   <br />        hTree.addNode(4);   <br />        hTree.addNode(4);   <br />        hTree.addNode(4);   <br />        hTree.addNode(5);   <br />        hTree.addNode(6);   <br />        hTree.createHuffmanTree();   <br />        hTree.printHuffmanTree();   <br />    }   <br />}  <br /><br /><br /><br /><br /><br /><br /><br /><br />在8×8的棋盘上分布着n个骑士，他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次，可以从中间向8个方向移动，请你计算n个骑士的最早聚会地点和要走多少天，要求尽早聚会，且n个人走的总步数最少，先到聚会地点的骑士可以不再移动等待其他的骑士。 <br />从键盘输入n（0&lt;n&lt;=64），然后一次输入n个其实的初始位置xi，yi（0&lt;=xi,y&lt;=7）。屏幕输出以空格分割的三个数，分别为聚会的点（x，y） 以及要走的天数。 <br />　○　○　 <br />○　　　○ <br />　　◎ <br />○　　　○ <br />　○　○　 <br />骑士走法（中间为起始位置，空为走到位置） <br /><br /><br />Java代码 <br />package convex;      <br />     <br />public class Point {      <br />     <br />    public int x, y;      <br />     <br />    public Point(int x, int y) {      <br />        if (x > 7 || y > 7) {      <br />            throw new RuntimeException("out of matrix");      <br />        }      <br />        this.x = x;      <br />        this.y = y;      <br />    }      <br />     <br />    public String toString() {      <br />        return "x=" + x + ",y=" + y;      <br />    }      <br />     <br />}      <br />  <br />  <br />  <br />  <br />package convex;            <br />        <br />import java.io.BufferedReader;         <br />import java.io.IOException;         <br />import java.io.InputStreamReader;         <br />import java.util.StringTokenizer;         <br />        <br />import convex.Point;            <br />           <br />public class Algo {            <br />        <br />    private boolean[][] flg = new boolean[8][8];         <br />        <br />    private int[][] shortPath = new int[8][8];         <br />             <br />    //最短距离矩阵         <br />    public int[][] distanceSq(Point p1) {         <br />        djkst(p1);         <br />        return shortPath;         <br />    }         <br />        <br />    //BFS          <br />    private void djkst(Point p1) {         <br />        Point[] queue = new Point[64];         <br />        flg[p1.x][p1.y] = true;         <br />        queue[0] = p1;         <br />        int j=0;         <br />        int queueSize = 1;         <br />        while (j &lt; queue.length) {         <br />                Point temp = queue[j];         <br />                Point[] list = getList(temp);         <br />                for(int i=0;i &lt; list.length;i++) {         <br />                    if(list[i] != null) {         <br />                        Point w = list[i];         <br />                        if (!flg[w.x][w.y]) {         <br />                            shortPath[w.x][w.y] = shortPath[temp.x][temp.y] + 1;                                     <br />                            queue[queueSize++] = w;         <br />                            flg[w.x][w.y] = true;         <br />                        }         <br />                    }         <br />                }         <br />            j++;         <br />        }         <br />    }         <br />        <br />    //可行步数集            <br />    private static Point[] getList(Point point) {         <br />        Point[] list = new Point[8];         <br />        int length = 0;         <br />        if (point.x + 2 &lt;= 7 && point.y + 1 &lt;= 7) {         <br />            list[length++] = new Point(point.x + 2, point.y + 1);         <br />        }         <br />        if (point.x - 2 >= 0 && point.y - 1 >= 0) {         <br />            list[length++] = new Point(point.x - 2, point.y - 1);         <br />        }         <br />        if (point.x + 1 &lt;= 7 && point.y + 2 &lt;= 7) {         <br />            list[length++] = new Point(point.x + 1, point.y + 2);         <br />        }         <br />        if (point.x - 1 >= 0 && point.y - 2 >= 0) {         <br />            list[length++] = new Point(point.x - 1, point.y - 2);         <br />        }         <br />        if (point.x + 2 &lt;= 7 && point.y - 1 >= 0) {         <br />            list[length++] = new Point(point.x + 2, point.y - 1);         <br />        }         <br />        if (point.x - 2 >= 0 && point.y + 1 &lt;= 7) {         <br />            list[length++] = new Point(point.x - 2, point.y + 1);         <br />        }         <br />        if (point.x + 1 &lt;= 7 && point.y - 2 >= 0) {         <br />            list[length++] = new Point(point.x + 1, point.y - 2);         <br />        }         <br />        if (point.x - 1 >= 0 && point.y + 2 &lt;= 7) {         <br />            list[length++] = new Point(point.x - 1, point.y + 2);         <br />        }         <br />        return list;         <br />    }         <br />             <br />    public static int[] method(Point[] points, int i,int j,Object[] pointList) {            <br />        int maxDay = 0;            <br />        int distance = 0;         <br />        for(int k=0;k&lt;pointList.length;k++) {         <br />            int day = ((int[][])pointList[k])[i][j];         <br />            distance += day;         <br />            if(maxDay&lt;day) {         <br />                maxDay = day;         <br />            }         <br />        }         <br />        return new int[]{maxDay,distance};            <br />    }         <br />           <br />    public static void main(String[] args) throws IOException {         <br />        //数据输入         <br />        //数据输入格式：第一个数字是骑士n，第2，3个数字是第一个骑士的坐标，依次类推。         <br />        //每个数字之间以空格区分         <br />        BufferedReader stdin =          <br />            new BufferedReader(         <br />                new InputStreamReader(System.in));         <br />        <br />        String line = stdin.readLine();         <br />        StringTokenizer st = new StringTokenizer(line);         <br />        int pointLength = Integer.parseInt(st.nextToken());         <br />        Point[] points = new Point[pointLength];         <br />        for(int i=0;i&lt;points.length;i++) {         <br />            int x = Integer.parseInt(st.nextToken());         <br />            int y = Integer.parseInt(st.nextToken());         <br />            points[i] = new Point(x,y);         <br />        }         <br />        Object[] pointList = new Object[points.length];         <br />        for (int j = 0; j &lt; points.length; j++) {            <br />            pointList[j] = new Algo().distanceSq(points[j]);         <br />        }         <br />        int minDay = 999999999;         <br />        int minDistance = 999999999;           <br />        for(int i=0;i&lt;7;i++) {         <br />            for(int j=0;j&lt;7;j++) {         <br />                int[] result = Algo.method(points, i,j,pointList);            <br />                //找最短天数，最短天数相同，找最短距离         <br />                if (minDay > result[0]) {         <br />                    minDay = result[0];         <br />                    minDistance = result[1];         <br />                } else if(minDay == result[0]) {         <br />                    if(minDistance > result[1]) {         <br />                        minDistance = result[1];         <br />                    }         <br />                }         <br />            }         <br />        }         <br />        for(int i=0;i&lt;7;i++) {         <br />            for(int j=0;j&lt;7;j++) {         <br />                int[] result = Algo.method(points, i,j,pointList);       <br />                if(minDay == result[0] && minDistance == result[1]) {      <br />                    System.out.println(i+" " + j +" "+ minDay);      <br />                }      <br />            }      <br />        }       <br />    }         <br />}       <br /><br />package convex;   <br />  <br />public class Point {   <br />  <br />    public int x, y;   <br />  <br />    public Point(int x, int y) {   <br />        if (x > 7 || y > 7) {   <br />            throw new RuntimeException("out of matrix");   <br />        }   <br />        this.x = x;   <br />        this.y = y;   <br />    }   <br />  <br />    public String toString() {   <br />        return "x=" + x + ",y=" + y;   <br />    }   <br />  <br />}   <br /><br /><br /><br /><br />package convex;         <br />     <br />import java.io.BufferedReader;      <br />import java.io.IOException;      <br />import java.io.InputStreamReader;      <br />import java.util.StringTokenizer;      <br />     <br />import convex.Point;         <br />        <br />public class Algo {         <br />     <br />    private boolean[][] flg = new boolean[8][8];      <br />     <br />    private int[][] shortPath = new int[8][8];      <br />          <br />    //最短距离矩阵      <br />    public int[][] distanceSq(Point p1) {      <br />        djkst(p1);      <br />        return shortPath;      <br />    }      <br />     <br />    //BFS       <br />    private void djkst(Point p1) {      <br />        Point[] queue = new Point[64];      <br />        flg[p1.x][p1.y] = true;      <br />        queue[0] = p1;      <br />        int j=0;      <br />        int queueSize = 1;      <br />        while (j &lt; queue.length) {      <br />                Point temp = queue[j];      <br />                Point[] list = getList(temp);      <br />                for(int i=0;i &lt; list.length;i++) {      <br />                    if(list[i] != null) {      <br />                        Point w = list[i];      <br />                        if (!flg[w.x][w.y]) {      <br />                            shortPath[w.x][w.y] = shortPath[temp.x][temp.y] + 1;                                  <br />                            queue[queueSize++] = w;      <br />                            flg[w.x][w.y] = true;      <br />                        }      <br />                    }      <br />                }      <br />            j++;      <br />        }      <br />    }      <br />     <br />    //可行步数集         <br />    private static Point[] getList(Point point) {      <br />        Point[] list = new Point[8];      <br />        int length = 0;      <br />        if (point.x + 2 &lt;= 7 && point.y + 1 &lt;= 7) {      <br />            list[length++] = new Point(point.x + 2, point.y + 1);      <br />        }      <br />        if (point.x - 2 >= 0 && point.y - 1 >= 0) {      <br />            list[length++] = new Point(point.x - 2, point.y - 1);      <br />        }      <br />        if (point.x + 1 &lt;= 7 && point.y + 2 &lt;= 7) {      <br />            list[length++] = new Point(point.x + 1, point.y + 2);      <br />        }      <br />        if (point.x - 1 >= 0 && point.y - 2 >= 0) {      <br />            list[length++] = new Point(point.x - 1, point.y - 2);      <br />        }      <br />        if (point.x + 2 &lt;= 7 && point.y - 1 >= 0) {      <br />            list[length++] = new Point(point.x + 2, point.y - 1);      <br />        }      <br />        if (point.x - 2 >= 0 && point.y + 1 &lt;= 7) {      <br />            list[length++] = new Point(point.x - 2, point.y + 1);      <br />        }      <br />        if (point.x + 1 &lt;= 7 && point.y - 2 >= 0) {      <br />            list[length++] = new Point(point.x + 1, point.y - 2);      <br />        }      <br />        if (point.x - 1 >= 0 && point.y + 2 &lt;= 7) {      <br />            list[length++] = new Point(point.x - 1, point.y + 2);      <br />        }      <br />        return list;      <br />    }      <br />          <br />    public static int[] method(Point[] points, int i,int j,Object[] pointList) {         <br />        int maxDay = 0;         <br />        int distance = 0;      <br />        for(int k=0;k&lt;pointList.length;k++) {      <br />            int day = ((int[][])pointList[k])[i][j];      <br />            distance += day;      <br />            if(maxDay&lt;day) {      <br />                maxDay = day;      <br />            }      <br />        }      <br />        return new int[]{maxDay,distance};         <br />    }      <br />        <br />    public static void main(String[] args) throws IOException {      <br />        //数据输入      <br />        //数据输入格式：第一个数字是骑士n，第2，3个数字是第一个骑士的坐标，依次类推。      <br />        //每个数字之间以空格区分      <br />        BufferedReader stdin =       <br />            new BufferedReader(      <br />                new InputStreamReader(System.in));      <br />     <br />        String line = stdin.readLine();      <br />        StringTokenizer st = new StringTokenizer(line);      <br />        int pointLength = Integer.parseInt(st.nextToken());      <br />        Point[] points = new Point[pointLength];      <br />        for(int i=0;i&lt;points.length;i++) {      <br />            int x = Integer.parseInt(st.nextToken());      <br />            int y = Integer.parseInt(st.nextToken());      <br />            points[i] = new Point(x,y);      <br />        }      <br />        Object[] pointList = new Object[points.length];      <br />        for (int j = 0; j &lt; points.length; j++) {         <br />            pointList[j] = new Algo().distanceSq(points[j]);      <br />        }      <br />        int minDay = 999999999;      <br />        int minDistance = 999999999;        <br />        for(int i=0;i&lt;7;i++) {      <br />            for(int j=0;j&lt;7;j++) {      <br />                int[] result = Algo.method(points, i,j,pointList);         <br />                //找最短天数，最短天数相同，找最短距离      <br />                if (minDay > result[0]) {      <br />                    minDay = result[0];      <br />                    minDistance = result[1];      <br />                } else if(minDay == result[0]) {      <br />                    if(minDistance > result[1]) {      <br />                        minDistance = result[1];      <br />                    }      <br />                }      <br />            }      <br />        }      <br />        for(int i=0;i&lt;7;i++) {      <br />            for(int j=0;j&lt;7;j++) {      <br />                int[] result = Algo.method(points, i,j,pointList);    <br />                if(minDay == result[0] && minDistance == result[1]) {   <br />                    System.out.println(i+" " + j +" "+ minDay);   <br />                }   <br />            }   <br />        }    <br />    }      <br />}     <br /><br /><br /><br /><br /><br /><br />下面开始写数据结构的基本代码： <br /><br />1 节点类 <br /><br />Java代码 <br />package graph;   <br />  <br />public class GraphNode {   <br />    public GraphNode link;   <br />    public int info;   <br />}  <br /><br />package graph;<br /><br />public class GraphNode {<br />	public GraphNode link;<br />	public int info;<br />}<br /><br /><br />2 邻接表表示图的链表类 <br /><br />Java代码 <br />package graph;   <br />  <br />public class GraphList {   <br />  <br />    public GraphNode first;   <br />    public GraphNode last;   <br />    public boolean visitable;   <br />    public int getAjd(int[] ajd) {   <br />        GraphNode current = first;   <br />        int length = 0;   <br />        while(current != null) {   <br />            ajd[length++] = current.info;   <br />            current = current.link;   <br />        }   <br />        return length;   <br />    }   <br />    public void addNode(int v) {   <br />        GraphNode node = new GraphNode();   <br />        node.info = v;   <br />        if(first == null) {   <br />            first = node;   <br />            last = node;   <br />        } else {   <br />            last.link = node;   <br />            last = node;   <br />        }   <br />    }   <br />}  <br /><br />package graph;<br /><br />public class GraphList {<br /><br />	public GraphNode first;<br />	public GraphNode last;<br />	public boolean visitable;<br />	public int getAjd(int[] ajd) {<br />		GraphNode current = first;<br />		int length = 0;<br />		while(current != null) {<br />			ajd[length++] = current.info;<br />			current = current.link;<br />		}<br />		return length;<br />	}<br />	public void addNode(int v) {<br />		GraphNode node = new GraphNode();<br />		node.info = v;<br />		if(first == null) {<br />			first = node;<br />			last = node;<br />		} else {<br />			last.link = node;<br />			last = node;<br />		}<br />	}<br />}<br /><br /><br />3 图类 <br /><br /><br /><br />Java代码 <br />package graph;   <br />  <br />public class Graph {   <br />    private int length;   <br />    private GraphList[] list;   <br />    public Graph(int length) {   <br />        this.length = length;   <br />        list = new GraphList[length];   <br />    }   <br />       <br />    public void dfs(int v) {   <br />        int[] ajd = new int[length];   <br />        int ajdlength = list[v].getAjd(ajd);   <br />        list[v].visitable = true;   <br />        System.out.print(v+" ");   <br />        for(int i=0;i&lt;ajdlength;i++) {   <br />            int w = ajd[i];   <br />            if(!list[w].visitable) {   <br />                dfs(w);   <br />            }   <br />        }   <br />    }   <br />       <br />    //深度优先遍历   <br />    public void dfsTravel() {   <br />        for(int i=0;i&lt;length;i++) {   <br />            list[i].visitable = false;   <br />        }   <br />        for(int i=0;i&lt;length;i++) {   <br />            if(!list[i].visitable) {   <br />                dfs(i);   <br />            }   <br />        }   <br />    }   <br />       <br />    //广度优先遍历   <br />    public void bfsTravel() {   <br />        for(int i=0;i&lt;length;i++) {   <br />            list[i].visitable = false;   <br />        }   <br />        bfs();   <br />    }   <br />       <br />    private void bfs() {   <br />        Queue queue = new Queue();   <br />        for(int index=0;index&lt;length;index++) {   <br />            if(!list[index].visitable) {   <br />                queue.addQueue(index);   <br />                list[index].visitable = true;   <br />                System.out.print(index+" ");   <br />                while(!queue.isEmpty()) {   <br />                    int temp = queue.front();   <br />                    queue.deleteQueue();   <br />                    int[] adj = new int[length];   <br />                    int ajdlength = list[temp].getAjd(adj);   <br />                    for(int i=0;i&lt;ajdlength;i++) {   <br />                        int w = adj[i];   <br />                        if(!list[w].visitable) {                               <br />                            System.out.print(w+" ");   <br />                            queue.addQueue(w);   <br />                            list[w].visitable = true;   <br />                        }   <br />                    }   <br />                }   <br />            }   <br />               <br />        }   <br />    }   <br />       <br />    //长度   <br />    public void length() {   <br />        System.out.println(length);   <br />    }   <br />       <br />    public boolean isEmpty() {   <br />        return length == 0;   <br />    }   <br />       <br />    //添加节点   <br />    public void addGraph(int info) {   <br />        for(int i=0;i&lt;length;i++) {   <br />            if(list[i] == null) {   <br />                GraphList g = new GraphList();   <br />                g.addNode(info);   <br />                list[i] = g;   <br />                break;   <br />            }   <br />        }   <br />    }   <br />       <br />    //添加边   <br />    public void addSide(int vfrom,int vto) {   <br />        list[vfrom].addNode(vto);   <br />    }   <br />       <br />    //打印图   <br />    public void print() {   <br />        for(int i=0;i&lt;length;i++) {   <br />            GraphNode current = list[i].first;   <br />            while(current != null) {   <br />                System.out.print(current.info+" ");   <br />                current = current.link;   <br />            }   <br />            System.out.println();   <br />        }   <br />    }   <br />       <br />    public static void main(String[] args) {   <br />        Graph graph = new Graph(11);   <br />        System.out.println("create graph start");   <br />        for(int i=0;i&lt;11;i++) {   <br />            graph.addGraph(i);   <br />        }   <br />        graph.addSide(0, 1);   <br />        graph.addSide(0, 5);   <br />        graph.addSide(1, 2);   <br />        graph.addSide(1, 3);   <br />        graph.addSide(1, 5);   <br />        graph.addSide(2, 4);   <br />        graph.addSide(4, 3);   <br />        graph.addSide(5, 6);           <br />        graph.addSide(6, 8 );   <br />        graph.addSide(7, 3);   <br />        graph.addSide(7, 8 );   <br />        graph.addSide(8, 10);   <br />        graph.addSide(9, 4);   <br />        graph.addSide(9, 7);   <br />        graph.addSide(9, 10);   <br />        graph.print();   <br />        System.out.println("create graph end");   <br />        graph.bfsTravel();   <br />    }   <br />  <br />}  <br /><br />package graph;<br /><br />public class Graph {<br />	private int length;<br />	private GraphList[] list;<br />	public Graph(int length) {<br />		this.length = length;<br />		list = new GraphList[length];<br />	}<br />	<br />	public void dfs(int v) {<br />		int[] ajd = new int[length];<br />		int ajdlength = list[v].getAjd(ajd);<br />		list[v].visitable = true;<br />		System.out.print(v+" ");<br />		for(int i=0;i&lt;ajdlength;i++) {<br />			int w = ajd[i];<br />			if(!list[w].visitable) {<br />				dfs(w);<br />			}<br />		}<br />	}<br />	<br />	//深度优先遍历<br />	public void dfsTravel() {<br />		for(int i=0;i&lt;length;i++) {<br />			list[i].visitable = false;<br />		}<br />		for(int i=0;i&lt;length;i++) {<br />			if(!list[i].visitable) {<br />				dfs(i);<br />			}<br />		}<br />	}<br />	<br />	//广度优先遍历<br />	public void bfsTravel() {<br />		for(int i=0;i&lt;length;i++) {<br />			list[i].visitable = false;<br />		}<br />		bfs();<br />	}<br />	<br />	private void bfs() {<br />		Queue queue = new Queue();<br />		for(int index=0;index&lt;length;index++) {<br />			if(!list[index].visitable) {<br />				queue.addQueue(index);<br />				list[index].visitable = true;<br />				System.out.print(index+" ");<br />				while(!queue.isEmpty()) {<br />					int temp = queue.front();<br />					queue.deleteQueue();<br />					int[] adj = new int[length];<br />					int ajdlength = list[temp].getAjd(adj);<br />					for(int i=0;i&lt;ajdlength;i++) {<br />						int w = adj[i];<br />						if(!list[w].visitable) {							<br />							System.out.print(w+" ");<br />							queue.addQueue(w);<br />							list[w].visitable = true;<br />						}<br />					}<br />				}<br />			}<br />			<br />		}<br />	}<br />	<br />	//长度<br />	public void length() {<br />		System.out.println(length);<br />	}<br />	<br />	public boolean isEmpty() {<br />		return length == 0;<br />	}<br />	<br />	//添加节点<br />	public void addGraph(int info) {<br />		for(int i=0;i&lt;length;i++) {<br />			if(list[i] == null) {<br />				GraphList g = new GraphList();<br />				g.addNode(info);<br />				list[i] = g;<br />				break;<br />			}<br />		}<br />	}<br />	<br />	//添加边<br />	public void addSide(int vfrom,int vto) {<br />		list[vfrom].addNode(vto);<br />	}<br />	<br />	//打印图<br />	public void print() {<br />		for(int i=0;i&lt;length;i++) {<br />			GraphNode current = list[i].first;<br />			while(current != null) {<br />				System.out.print(current.info+" ");<br />				current = current.link;<br />			}<br />			System.out.println();<br />		}<br />	}<br />	<br />	public static void main(String[] args) {<br />		Graph graph = new Graph(11);<br />		System.out.println("create graph start");<br />		for(int i=0;i&lt;11;i++) {<br />			graph.addGraph(i);<br />		}<br />		graph.addSide(0, 1);<br />		graph.addSide(0, 5);<br />		graph.addSide(1, 2);<br />		graph.addSide(1, 3);<br />		graph.addSide(1, 5);<br />		graph.addSide(2, 4);<br />		graph.addSide(4, 3);<br />		graph.addSide(5, 6);		<br />		graph.addSide(6, 8 );<br />		graph.addSide(7, 3);<br />		graph.addSide(7, 8 );<br />		graph.addSide(8, 10);<br />		graph.addSide(9, 4);<br />		graph.addSide(9, 7);<br />		graph.addSide(9, 10);<br />		graph.print();<br />		System.out.println("create graph end");<br />		graph.bfsTravel();<br />	}<br /><br />}<br /><br /><br />4 队列 <br /><br /><br />Java代码 <br />package graph;   <br />  <br />public class Queue {   <br />    public GraphNode first;   <br />    public GraphNode last;   <br />    public int count;   <br />    public void addQueue(int info) {   <br />        GraphNode node = new GraphNode();   <br />        node.info = info;   <br />        if(first == null) {   <br />            first = node;   <br />            last = node;   <br />        } else {   <br />            last.link = node;   <br />            last = last.link;   <br />        }   <br />        count++;   <br />    }    <br />       <br />    public void deleteQueue() {   <br />        if(first == null) {   <br />            System.out.println("null queue");   <br />        } else {   <br />            first = first.link;   <br />            count--;   <br />        }   <br />    }   <br />       <br />    public boolean isEmpty() {   <br />        return count == 0;   <br />    }   <br />       <br />    public int front() {   <br />        if(first == null) {   <br />            return -1;   <br />        }   <br />        return first.info;   <br />    }   <br />       <br />    public int back() {   <br />        if(last == null) {   <br />            return -1;   <br />        }   <br />        return last.info;   <br />    }   <br />}  <br /><br />package graph;<br /><br />public class Queue {<br />	public GraphNode first;<br />	public GraphNode last;<br />	public int count;<br />	public void addQueue(int info) {<br />		GraphNode node = new GraphNode();<br />		node.info = info;<br />		if(first == null) {<br />			first = node;<br />			last = node;<br />		} else {<br />			last.link = node;<br />			last = last.link;<br />		}<br />		count++;<br />	} <br />	<br />	public void deleteQueue() {<br />		if(first == null) {<br />			System.out.println("null queue");<br />		} else {<br />			first = first.link;<br />			count--;<br />		}<br />	}<br />	<br />	public boolean isEmpty() {<br />		return count == 0;<br />	}<br />	<br />	public int front() {<br />		if(first == null) {<br />			return -1;<br />		}<br />		return first.info;<br />	}<br />	<br />	public int back() {<br />		if(last == null) {<br />			return -1;<br />		}<br />		return last.info;<br />	}<br />}<br /><br /><br />5 堆栈 <br /><br /><br />Java代码 <br />package graph;   <br />  <br />public class Stack {   <br />    public GraphNode stackTop;   <br />    public int count;   <br />    public void push(int info) {   <br />        GraphNode node = new GraphNode();   <br />        node.info = info;   <br />        node.link = stackTop;   <br />        stackTop = node;   <br />        count++;   <br />    }    <br />       <br />    public void pop() {   <br />        if(stackTop == null) {   <br />            System.out.println("null stack");   <br />        } else {   <br />            stackTop = stackTop.link;   <br />            count--;   <br />        }   <br />  <br />    }   <br />       <br />    public int top() {   <br />        if(stackTop == null) {   <br />            return -1;   <br />        }   <br />        return stackTop.info;   <br />    }   <br />  <br />}  <br /><br />package graph;<br /><br />public class Stack {<br />	public GraphNode stackTop;<br />	public int count;<br />	public void push(int info) {<br />		GraphNode node = new GraphNode();<br />		node.info = info;<br />		node.link = stackTop;<br />		stackTop = node;<br />		count++;<br />	} <br />	<br />	public void pop() {<br />		if(stackTop == null) {<br />			System.out.println("null stack");<br />		} else {<br />			stackTop = stackTop.link;<br />			count--;<br />		}<br /><br />	}<br />	<br />	public int top() {<br />		if(stackTop == null) {<br />			return -1;<br />		}<br />		return stackTop.info;<br />	}<br /><br />}<br /><br /><br />6 图的最短路径算法 <br /><br /><br />Java代码 <br />package graph;   <br />  <br />public class Graph {   <br />    private int length;   <br />    private GraphList[] list;   <br />    private int[][] weight;   <br />  <br />    public Graph(int length) {   <br />        this.length = length;   <br />        list = new GraphList[length];   <br />        weight = new int[length][length];   <br />    }   <br />  <br />    public void dfs(int v) {   <br />        int[] ajd = new int[length];   <br />        int ajdlength = list[v].getAjd(ajd);   <br />        list[v].visitable = true;   <br />        System.out.print(v + " ");   <br />        for (int i = 0; i &lt; ajdlength; i++) {   <br />            int w = ajd[i];   <br />            if (!list[w].visitable) {   <br />                dfs(w);   <br />            }   <br />        }   <br />    }   <br />  <br />    // 深度优先遍历   <br />    public void dfsTravel() {   <br />        for (int i = 0; i &lt; length; i++) {   <br />            list[i].visitable = false;   <br />        }   <br />        for (int i = 0; i &lt; length; i++) {   <br />            if (!list[i].visitable) {   <br />                dfs(i);   <br />            }   <br />        }   <br />    }   <br />  <br />    // 广度优先遍历   <br />    public void bfsTravel() {   <br />        for (int i = 0; i &lt; length; i++) {   <br />            list[i].visitable = false;   <br />        }   <br />        bfs();   <br />    }   <br />  <br />    private void bfs() {   <br />        Queue queue = new Queue();   <br />        for (int index = 0; index &lt; length; index++) {   <br />            if (!list[index].visitable) {   <br />                queue.addQueue(index);   <br />                list[index].visitable = true;   <br />                System.out.print(index + " ");   <br />                while (!queue.isEmpty()) {   <br />                    int temp = queue.front();   <br />                    queue.deleteQueue();   <br />                    int[] ajd = new int[length];   <br />                    int ajdlength = list[temp].getAjd(ajd);   <br />                    for (int i = 0; i &lt; ajdlength; i++) {   <br />                        int w = ajd[i];   <br />                        if (!list[w].visitable) {   <br />                            System.out.print(w + " ");   <br />                            queue.addQueue(w);   <br />                            list[w].visitable = true;   <br />                        }   <br />                    }   <br />                }   <br />            }   <br />  <br />        }   <br />    }   <br />  <br />    // 最短路径   <br />    private int[] shortPath(int v) {   <br />        int[] shortPath = new int[length];   <br />        boolean[] weightFound = new boolean[length];   <br />        for (int i = 0; i &lt; length; i++) {   <br />            // 趋近无穷   <br />            shortPath[i] = 9999;   <br />            weightFound[i] = false;   <br />        }   <br />        shortPath[v] = 0;   <br />        weightFound[v] = true;   <br />        Queue queue = new Queue();   <br />        queue.addQueue(v);   <br />        while (!queue.isEmpty()) {   <br />            int temp = queue.front();   <br />            queue.deleteQueue();   <br />            int[] ajd = new int[length];   <br />            int ajdlength = list[temp].getAjd(ajd);   <br />            for (int i = 0; i &lt; ajdlength; i++) {   <br />                int w = ajd[i];   <br />                if (!weightFound[w]) {   <br />                    if (shortPath[w] > shortPath[temp] + weight[temp][w]) {   <br />                        shortPath[w] = shortPath[temp] + weight[temp][w];   <br />                    }   <br />                }   <br />            }   <br />            int minWeightNode = 0;   <br />            for (int i = 0; i &lt; length; i++) {   <br />                if (!weightFound[i]) {   <br />                    minWeightNode = i;   <br />                    for (int j = 0; j &lt; length; j++) {   <br />                        if (!weightFound[j]) {   <br />                            if (shortPath[j] &lt; shortPath[minWeightNode]) {   <br />                                minWeightNode = j;   <br />                            }   <br />                        }   <br />                    }   <br />                    break;   <br />                }   <br />            }   <br />            if (!weightFound[minWeightNode]) {   <br />                weightFound[minWeightNode] = true;   <br />                queue.addQueue(minWeightNode);   <br />            }   <br />        }   <br />        return shortPath;   <br />    }   <br />  <br />    // 长度   <br />    public void length() {   <br />        System.out.println(length);   <br />    }   <br />  <br />    public boolean isEmpty() {   <br />        return length == 0;   <br />    }   <br />  <br />    // 添加节点   <br />    public void addGraph(int info) {   <br />        for (int i = 0; i &lt; length; i++) {   <br />            if (list[i] == null) {   <br />                GraphList g = new GraphList();   <br />                g.addNode(info);   <br />                list[i] = g;   <br />                break;   <br />            }   <br />        }   <br />    }   <br />  <br />    // 添加边   <br />    public void addSide(int vfrom, int vto, int value) {   <br />        list[vfrom].addNode(vto);   <br />        weight[vfrom][vto] = value;   <br />    }   <br />  <br />    // 打印图   <br />    public void print() {   <br />        for (int i = 0; i &lt; length; i++) {   <br />            GraphNode current = list[i].first;   <br />            while (current != null) {   <br />                System.out.print(current.info + " ");   <br />                current = current.link;   <br />            }   <br />            System.out.println();   <br />        }   <br />    }   <br />  <br />    public static void main(String[] args) {   <br />        Graph graph = new Graph(5);   <br />        System.out.println("create graph start");   <br />        for (int i = 0; i &lt; 5; i++) {   <br />            graph.addGraph(i);   <br />        }   <br />        graph.addSide(0, 1, 16);   <br />        graph.addSide(0, 3, 2);   <br />        graph.addSide(0, 4, 3);   <br />        graph.addSide(3, 4, 7);   <br />        graph.addSide(3, 1, 12);   <br />        graph.addSide(4, 1, 10);   <br />        graph.addSide(4, 3, 5);   <br />        graph.addSide(4, 2, 4);   <br />        graph.addSide(2, 1, 3);   <br />        graph.addSide(1, 2, 5);   <br />        graph.print();   <br />        System.out.println("create graph end");   <br />        int[] shortPath = graph.shortPath(0);   <br />        for (int i = 0; i &lt; shortPath.length; i++) {   <br />            System.out.print(shortPath[i] + " ");   <br />        }   <br />    }   <br />  <br />}  <br /><br />package graph;<br /><br />public class Graph {<br />	private int length;<br />	private GraphList[] list;<br />	private int[][] weight;<br /><br />	public Graph(int length) {<br />		this.length = length;<br />		list = new GraphList[length];<br />		weight = new int[length][length];<br />	}<br /><br />	public void dfs(int v) {<br />		int[] ajd = new int[length];<br />		int ajdlength = list[v].getAjd(ajd);<br />		list[v].visitable = true;<br />		System.out.print(v + " ");<br />		for (int i = 0; i &lt; ajdlength; i++) {<br />			int w = ajd[i];<br />			if (!list[w].visitable) {<br />				dfs(w);<br />			}<br />		}<br />	}<br /><br />	// 深度优先遍历<br />	public void dfsTravel() {<br />		for (int i = 0; i &lt; length; i++) {<br />			list[i].visitable = false;<br />		}<br />		for (int i = 0; i &lt; length; i++) {<br />			if (!list[i].visitable) {<br />				dfs(i);<br />			}<br />		}<br />	}<br /><br />	// 广度优先遍历<br />	public void bfsTravel() {<br />		for (int i = 0; i &lt; length; i++) {<br />			list[i].visitable = false;<br />		}<br />		bfs();<br />	}<br /><br />	private void bfs() {<br />		Queue queue = new Queue();<br />		for (int index = 0; index &lt; length; index++) {<br />			if (!list[index].visitable) {<br />				queue.addQueue(index);<br />				list[index].visitable = true;<br />				System.out.print(index + " ");<br />				while (!queue.isEmpty()) {<br />					int temp = queue.front();<br />					queue.deleteQueue();<br />					int[] ajd = new int[length];<br />					int ajdlength = list[temp].getAjd(ajd);<br />					for (int i = 0; i &lt; ajdlength; i++) {<br />						int w = ajd[i];<br />						if (!list[w].visitable) {<br />							System.out.print(w + " ");<br />							queue.addQueue(w);<br />							list[w].visitable = true;<br />						}<br />					}<br />				}<br />			}<br /><br />		}<br />	}<br /><br />	// 最短路径<br />	private int[] shortPath(int v) {<br />		int[] shortPath = new int[length];<br />		boolean[] weightFound = new boolean[length];<br />		for (int i = 0; i &lt; length; i++) {<br />			// 趋近无穷<br />			shortPath[i] = 9999;<br />			weightFound[i] = false;<br />		}<br />		shortPath[v] = 0;<br />		weightFound[v] = true;<br />		Queue queue = new Queue();<br />		queue.addQueue(v);<br />		while (!queue.isEmpty()) {<br />			int temp = queue.front();<br />			queue.deleteQueue();<br />			int[] ajd = new int[length];<br />			int ajdlength = list[temp].getAjd(ajd);<br />			for (int i = 0; i &lt; ajdlength; i++) {<br />				int w = ajd[i];<br />				if (!weightFound[w]) {<br />					if (shortPath[w] > shortPath[temp] + weight[temp][w]) {<br />						shortPath[w] = shortPath[temp] + weight[temp][w];<br />					}<br />				}<br />			}<br />			int minWeightNode = 0;<br />			for (int i = 0; i &lt; length; i++) {<br />				if (!weightFound[i]) {<br />					minWeightNode = i;<br />					for (int j = 0; j &lt; length; j++) {<br />						if (!weightFound[j]) {<br />							if (shortPath[j] &lt; shortPath[minWeightNode]) {<br />								minWeightNode = j;<br />							}<br />						}<br />					}<br />					break;<br />				}<br />			}<br />			if (!weightFound[minWeightNode]) {<br />				weightFound[minWeightNode] = true;<br />				queue.addQueue(minWeightNode);<br />			}<br />		}<br />		return shortPath;<br />	}<br /><br />	// 长度<br />	public void length() {<br />		System.out.println(length);<br />	}<br /><br />	public boolean isEmpty() {<br />		return length == 0;<br />	}<br /><br />	// 添加节点<br />	public void addGraph(int info) {<br />		for (int i = 0; i &lt; length; i++) {<br />			if (list[i] == null) {<br />				GraphList g = new GraphList();<br />				g.addNode(info);<br />				list[i] = g;<br />				break;<br />			}<br />		}<br />	}<br /><br />	// 添加边<br />	public void addSide(int vfrom, int vto, int value) {<br />		list[vfrom].addNode(vto);<br />		weight[vfrom][vto] = value;<br />	}<br /><br />	// 打印图<br />	public void print() {<br />		for (int i = 0; i &lt; length; i++) {<br />			GraphNode current = list[i].first;<br />			while (current != null) {<br />				System.out.print(current.info + " ");<br />				current = current.link;<br />			}<br />			System.out.println();<br />		}<br />	}<br /><br />	public static void main(String[] args) {<br />		Graph graph = new Graph(5);<br />		System.out.println("create graph start");<br />		for (int i = 0; i &lt; 5; i++) {<br />			graph.addGraph(i);<br />		}<br />		graph.addSide(0, 1, 16);<br />		graph.addSide(0, 3, 2);<br />		graph.addSide(0, 4, 3);<br />		graph.addSide(3, 4, 7);<br />		graph.addSide(3, 1, 12);<br />		graph.addSide(4, 1, 10);<br />		graph.addSide(4, 3, 5);<br />		graph.addSide(4, 2, 4);<br />		graph.addSide(2, 1, 3);<br />		graph.addSide(1, 2, 5);<br />		graph.print();<br />		System.out.println("create graph end");<br />		int[] shortPath = graph.shortPath(0);<br />		for (int i = 0; i &lt; shortPath.length; i++) {<br />			System.out.print(shortPath[i] + " ");<br />		}<br />	}<br /><br />}<br /><br /><br />8 普里姆最小生成树 <br /><br /><br />Java代码 <br />package graph;   <br />  <br />/**  <br /> * @author B.Chen  <br /> *  <br /> */  <br />public class Graph {   <br />  <br />    /**  <br />     * 节点数  <br />     */  <br />    private int length;   <br />  <br />    /**  <br />     * 链表  <br />     */  <br />    private GraphList[] list;   <br />  <br />    /**  <br />     * 权集  <br />     */  <br />    private int[][] weight;   <br />       <br />    /**  <br />     * 轻边集  <br />     */  <br />    private int[][] lightSide;   <br />  <br />    /**  <br />     * @param length  <br />     */  <br />    public Graph(int length) {   <br />        this.length = length;   <br />        list = new GraphList[length];   <br />        weight = new int[length][length];   <br />        lightSide = new int[length][length];   <br />    }   <br />  <br />    /**  <br />     * @param v  <br />     */  <br />    public void dfs(int v) {   <br />        int[] ajd = new int[length];   <br />        int ajdlength = list[v].getAjd(ajd);   <br />        list[v].visitable = true;   <br />        System.out.print(v + " ");   <br />        for (int i = 0; i &lt; ajdlength; i++) {   <br />            int w = ajd[i];   <br />            if (!list[w].visitable) {   <br />                dfs(w);   <br />            }   <br />        }   <br />    }   <br />  <br />    /**  <br />     * 深度优先遍历     <br />     */  <br />    public void dfsTravel() {   <br />        for (int i = 0; i &lt; length; i++) {   <br />            list[i].visitable = false;   <br />        }   <br />        for (int i = 0; i &lt; length; i++) {   <br />            if (!list[i].visitable) {   <br />                dfs(i);   <br />            }   <br />        }   <br />    }   <br />  <br />    /**  <br />     * 广度优先遍历   <br />     */  <br />    public void bfsTravel() {   <br />        for (int i = 0; i &lt; length; i++) {   <br />            list[i].visitable = false;   <br />        }   <br />        bfs();   <br />    }   <br />  <br />    /**  <br />     * bfs  <br />     */  <br />    private void bfs() {   <br />        Queue queue = new Queue();   <br />        for (int index = 0; index &lt; length; index++) {   <br />            if (!list[index].visitable) {   <br />                queue.addQueue(index);   <br />                list[index].visitable = true;   <br />                System.out.print(index + " ");   <br />                while (!queue.isEmpty()) {   <br />                    int temp = queue.front();   <br />                    queue.deleteQueue();   <br />                    int[] adj = new int[length];   <br />                    int ajdlength = list[temp].getAjd(adj);   <br />                    for (int i = 0; i &lt; ajdlength; i++) {   <br />                        int w = adj[i];   <br />                        if (!list[w].visitable) {   <br />                            System.out.print(w + " ");   <br />                            queue.addQueue(w);   <br />                            list[w].visitable = true;   <br />                        }   <br />                    }   <br />                }   <br />            }   <br />  <br />        }   <br />    }   <br />  <br />    /**  <br />     * 长度     <br />     */  <br />    public void length() {   <br />        System.out.println(length);   <br />    }   <br />  <br />    /**  <br />     * @return boolean  <br />     */  <br />    public boolean isEmpty() {   <br />        return length == 0;   <br />    }   <br />  <br />    /**  <br />     * @param info  <br />     */  <br />    public void addGraph(int info) {   <br />        for (int i = 0; i &lt; length; i++) {   <br />            if (list[i] == null) {   <br />                GraphList g = new GraphList();   <br />                g.addNode(info);   <br />                list[i] = g;   <br />                break;   <br />            }   <br />        }   <br />    }   <br />  <br />    /**  <br />     * 添加有向图的一条边  <br />     * @param vfrom  <br />     * @param vto  <br />     * @param value 权  <br />     */  <br />    public void addSide(int vfrom, int vto, int value) {   <br />        list[vfrom].addNode(vto);   <br />        weight[vfrom][vto] = value;   <br />    }   <br />  <br />    /**  <br />     * 添加无向图的一条边  <br />     * @param vfrom  <br />     * @param vto  <br />     * @param value  <br />     */  <br />    public void addDoubleSide(int vfrom, int vto, int value) {   <br />        list[vfrom].addNode(vto);   <br />        list[vto].addNode(vfrom);   <br />        weight[vfrom][vto] = value;   <br />        weight[vto][vfrom] = value;   <br />    }   <br />  <br />    /**  <br />     * 打印图     <br />     */  <br />    public void print() {   <br />        for (int i = 0; i &lt; length; i++) {   <br />            GraphNode current = list[i].first;   <br />            while (current != null) {   <br />                System.out.print(current.info + " ");   <br />                current = current.link;   <br />            }   <br />            System.out.println();   <br />        }   <br />    }   <br />  <br />    /**  <br />     * Dijkstra  <br />     *   <br />     * @param v  <br />     * @return int[]  <br />     */  <br />    public int[] shortPath(int v) {   <br />        int[] shortPath = new int[length];   <br />        boolean[] weightFound = new boolean[length];   <br />        for (int i = 0; i &lt; length; i++) {   <br />            // 趋近无穷   <br />            shortPath[i] = 9999;   <br />            weightFound[i] = false;   <br />        }   <br />        shortPath[v] = 0;   <br />        weightFound[v] = true;   <br />        Queue queue = new Queue();   <br />        queue.addQueue(v);   <br />        while (!queue.isEmpty()) {   <br />            int temp = queue.front();   <br />            queue.deleteQueue();   <br />            int[] ajd = new int[length];   <br />            int ajdlength = list[temp].getAjd(ajd);   <br />            for (int i = 0; i &lt; ajdlength; i++) {   <br />                int w = ajd[i];   <br />                if (!weightFound[w]) {   <br />                    if (shortPath[w] > shortPath[temp] + weight[temp][w]) {   <br />                        shortPath[w] = shortPath[temp] + weight[temp][w];   <br />                    }   <br />                }   <br />            }   <br />            int minWeightNode = 0;   <br />            for (int i = 0; i &lt; length; i++) {   <br />                if (!weightFound[i]) {   <br />                    minWeightNode = i;   <br />                    for (int j = 0; j &lt; length; j++) {   <br />                        if (!weightFound[j]) {   <br />                            if (shortPath[j] &lt; shortPath[minWeightNode]) {   <br />                                minWeightNode = j;   <br />                            }   <br />                        }   <br />                    }   <br />                    break;   <br />                }   <br />            }   <br />            if (!weightFound[minWeightNode]) {   <br />                weightFound[minWeightNode] = true;   <br />                queue.addQueue(minWeightNode);   <br />            }   <br />        }   <br />        return shortPath;   <br />    }   <br />       <br />    /**  <br />     * 普里姆最小生成树  <br />     *   <br />     * @param v  <br />     */  <br />    public void primMST(int v) {   <br />        boolean[] visited = new boolean[length];   <br />        for (int i = 0; i &lt; length; i++) {   <br />            visited[i] = false;   <br />            for (int j = 0; j &lt; length; j++) {   <br />                lightSide[i][j] = 9999;   <br />            }   <br />        }   <br />        visited[v] = true;   <br />        Queue queue = new Queue();   <br />        queue.addQueue(v);   <br />        while (!queue.isEmpty()) {   <br />            int temp = queue.front();   <br />            queue.deleteQueue();   <br />            int[] ajd = new int[length];   <br />            int ajdlength = list[temp].getAjd(ajd);   <br />            for (int i = 0; i &lt; ajdlength; i++) {   <br />                int w = ajd[i];   <br />                lightSide[temp][w] = weight[temp][w];   <br />            }   <br />            // 找到最小边   <br />            int minSide = 0;   <br />            int vfrom =0;   <br />            int vto = 0;   <br />            for (int i = 0; i &lt; length; i++) {   <br />                for (int j = 0; j &lt; length; j++) {   <br />                    if (visited[i] && visited[j]) {   <br />                        continue;   <br />                    }   <br />                    minSide = lightSide[i][j];   <br />                    vfrom = i;   <br />                    vto = j;   <br />                    for (int k = 0; k &lt; length; k++) {   <br />                        for (int l = 0; l &lt; length; l++) {   <br />                            if (visited[k] && visited[l]) {   <br />                                continue;   <br />                            }   <br />                            if (lightSide[k][l] &lt; minSide) {   <br />                                minSide = lightSide[k][l];   <br />                                vfrom = k;   <br />                                vto = l;   <br />                            }   <br />                        }   <br />                    }   <br />                    break;   <br />                }   <br />            }   <br />            //将最小边的节点vto设为true，并输出vto   <br />            if (!visited[vto]) {   <br />                visited[vto] = true;   <br />                System.out.print(vfrom+"==>" + vto+", ");   <br />                queue.addQueue(vto);
          <br/>
          <span style="color:red;">
            <a href="http://xiaoqiu369.javaeye.com/blog/215817#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Jul 2008 15:14:22 +0800</pubDate>
        <link>http://xiaoqiu369.javaeye.com/blog/215817</link>
        <guid>http://xiaoqiu369.javaeye.com/blog/215817</guid>
      </item>
      <item>
        <title>数据结构java的实现</title>
        <author>xiaoqiu369</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xiaoqiu369.javaeye.com">xiaoqiu369</a>&nbsp;
          链接：<a href="http://xiaoqiu369.javaeye.com/blog/215815" style="color:red;">http://xiaoqiu369.javaeye.com/blog/215815</a>&nbsp;
          发表时间: 2008年07月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1 树与哈夫曼树 

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;   
  
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");   
  
    }   
}     


Java代码 
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();      
    }      
}    

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();   
    }   
}  








在8×8的棋盘上分布着n个骑士，他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次，可以从中间向8个方向移动，请你计算n个骑士的最早聚会地点和要走多少天，要求尽早聚会，且n个人走的总步数最少，先到聚会地点的骑士可以不再移动等待其他的骑士。 
从键盘输入n（0<n<=64），然后一次输入n个其实的初始位置xi，yi（0<=xi,y<=7）。屏幕输出以空格分割的三个数，分别为聚会的点（x，y） 以及要走的天数。 
　○　○　 
○　　　○ 
　　◎ 
○　　　○ 
　○　○　 
骑士走法（中间为起始位置，空为走到位置） 


Java代码 
package convex;      
     
public class Point {      
     
    public int x, y;      
     
    public Point(int x, int y) {      
        if (x > 7 || y > 7) {      
            throw new RuntimeException("out of matrix");      
        }      
        this.x = x;      
        this.y = y;      
    }      
     
    public String toString() {      
        return "x=" + x + ",y=" + y;      
    }      
     
}      
  
  
  
  
package convex;            
        
import java.io.BufferedReader;         
import java.io.IOException;         
import java.io.InputStreamReader;         
import java.util.StringTokenizer;         
        
import convex.Point;            
           
public class Algo {            
        
    private boolean[][] flg = new boolean[8][8];         
        
    private int[][] shortPath = new int[8][8];         
             
    //最短距离矩阵         
    public int[][] distanceSq(Point p1) {         
        djkst(p1);         
        return shortPath;         
    }         
        
    //BFS          
    private void djkst(Point p1) {         
        Point[] queue = new Point[64];         
        flg[p1.x][p1.y] = true;         
        queue[0] = p1;         
        int j=0;         
        int queueSize = 1;         
        while (j < queue.length) {         
                Point temp = queue[j];         
                Point[] list = getList(temp);         
                for(int i=0;i < list.length;i++) {         
                    if(list[i] != null) {         
                        Point w = list[i];         
                        if (!flg[w.x][w.y]) {         
                            shortPath[w.x][w.y] = shortPath[temp.x][temp.y] + 1;                                     
                            queue[queueSize++] = w;         
                            flg[w.x][w.y] = true;         
                        }         
                    }         
                }         
            j++;         
        }         
    }         
        
    //可行步数集            
    private static Point[] getList(Point point) {         
        Point[] list = new Point[8];         
        int length = 0;         
        if (point.x + 2 <= 7 && point.y + 1 <= 7) {         
            list[length++] = new Point(point.x + 2, point.y + 1);         
        }         
        if (point.x - 2 >= 0 && point.y - 1 >= 0) {         
            list[length++] = new Point(point.x - 2, point.y - 1);         
        }         
        if (point.x + 1 <= 7 && point.y + 2 <= 7) {         
            list[length++] = new Point(point.x + 1, point.y + 2);         
        }         
        if (point.x - 1 >= 0 && point.y - 2 >= 0) {         
            list[length++] = new Point(point.x - 1, point.y - 2);         
        }         
        if (point.x + 2 <= 7 && point.y - 1 >= 0) {         
            list[length++] = new Point(point.x + 2, point.y - 1);         
        }         
        if (point.x - 2 >= 0 && point.y + 1 <= 7) {         
            list[length++] = new Point(point.x - 2, point.y + 1);         
        }         
        if (point.x + 1 <= 7 && point.y - 2 >= 0) {         
            list[length++] = new Point(point.x + 1, point.y - 2);         
        }         
        if (point.x - 1 >= 0 && point.y + 2 <= 7) {         
            list[length++] = new Point(point.x - 1, point.y + 2);         
        }         
        return list;         
    }         
             
    public static int[] method(Point[] points, int i,int j,Object[] pointList) {            
        int maxDay = 0;            
        int distance = 0;         
        for(int k=0;k<pointList.length;k++) {         
            int day = ((int[][])pointList[k])[i][j];         
            distance += day;         
            if(maxDay<day) {         
                maxDay = day;         
            }         
        }         
        return new int[]{maxDay,distance};            
    }         
           
    public static void main(String[] args) throws IOException {         
        //数据输入         
        //数据输入格式：第一个数字是骑士n，第2，3个数字是第一个骑士的坐标，依次类推。         
        //每个数字之间以空格区分         
        BufferedReader stdin =          
            new BufferedReader(         
                new InputStreamReader(System.in));         
        
        String line = stdin.readLine();         
        StringTokenizer st = new StringTokenizer(line);         
        int pointLength = Integer.parseInt(st.nextToken());         
        Point[] points = new Point[pointLength];         
        for(int i=0;i<points.length;i++) {         
            int x = Integer.parseInt(st.nextToken());         
            int y = Integer.parseInt(st.nextToken());         
            points[i] = new Point(x,y);         
        }         
        Object[] pointList = new Object[points.length];         
        for (int j = 0; j < points.length; j++) {            
            pointList[j] = new Algo().distanceSq(points[j]);         
        }         
        int minDay = 999999999;         
        int minDistance = 999999999;           
        for(int i=0;i<7;i++) {         
            for(int j=0;j<7;j++) {         
                int[] result = Algo.method(points, i,j,pointList);            
                //找最短天数，最短天数相同，找最短距离         
                if (minDay > result[0]) {         
                    minDay = result[0];         
                    minDistance = result[1];         
                } else if(minDay == result[0]) {         
                    if(minDistance > result[1]) {         
                        minDistance = result[1];         
                    }         
                }         
            }         
        }         
        for(int i=0;i<7;i++) {         
            for(int j=0;j<7;j++) {         
                int[] result = Algo.method(points, i,j,pointList);       
                if(minDay == result[0] && minDistance == result[1]) {      
                    System.out.println(i+" " + j +" "+ minDay);      
                }      
            }      
        }       
    }         
}       

package convex;   
  
public class Point {   
  
    public int x, y;   
  
    public Point(int x, int y) {   
        if (x > 7 || y > 7) {   
            throw new RuntimeException("out of matrix");   
        }   
        this.x = x;   
        this.y = y;   
    }   
  
    public String toString() {   
        return "x=" + x + ",y=" + y;   
    }   
  
}   




package convex;         
     
import java.io.BufferedReader;      
import java.io.IOException;      
import java.io.InputStreamReader;      
import java.util.StringTokenizer;      
     
import convex.Point;         
        
public class Algo {         
     
    private boolean[][] flg = new boolean[8][8];      
     
    private int[][] shortPath = new int[8][8];      
          
    //最短距离矩阵      
    public int[][] distanceSq(Point p1) {      
        djkst(p1);      
        return shortPath;      
    }      
     
    //BFS       
    private void djkst(Point p1) {      
        Point[] queue = new Point[64];      
        flg[p1.x][p1.y] = true;      
        queue[0] = p1;      
        int j=0;      
        int queueSize = 1;      
        while (j < queue.length) {      
                Point temp = queue[j];      
                Point[] list = getList(temp);      
                for(int i=0;i < list.length;i++) {      
                    if(list[i] != null) {      
                        Point w = list[i];      
                        if (!flg[w.x][w.y]) {      
                            shortPath[w.x][w.y] = shortPath[temp.x][temp.y] + 1;                                  
                            queue[queueSize++] = w;      
                            flg[w.x][w.y] = true;      
                        }      
                    }      
                }      
            j++;      
        }      
    }      
     
    //可行步数集         
    private static Point[] getList(Point point) {      
        Point[] list = new Point[8];      
        int length = 0;      
        if (point.x + 2 <= 7 && point.y + 1 <= 7) {      
            list[length++] = new Point(point.x + 2, point.y + 1);      
        }      
        if (point.x - 2 >= 0 && point.y - 1 >= 0) {      
            list[length++] = new Point(point.x - 2, point.y - 1);      
        }      
        if (point.x + 1 <= 7 && point.y + 2 <= 7) {      
            list[length++] = new Point(point.x + 1, point.y + 2);      
        }      
        if (point.x - 1 >= 0 && point.y - 2 >= 0) {      
            list[length++] = new Point(point.x - 1, point.y - 2);      
        }      
        if (point.x + 2 <= 7 && point.y - 1 >= 0) {      
            list[length++] = new Point(point.x + 2, point.y - 1);      
        }      
        if (point.x - 2 >= 0 && point.y + 1 <= 7) {      
            list[length++] = new Point(point.x - 2, point.y + 1);      
        }      
        if (point.x + 1 <= 7 && point.y - 2 >= 0) {      
            list[length++] = new Point(point.x + 1, point.y - 2);      
        }      
        if (point.x - 1 >= 0 && point.y + 2 <= 7) {      
            list[length++] = new Point(point.x - 1, point.y + 2);      
        }      
        return list;      
    }      
          
    public static int[] method(Point[] points, int i,int j,Object[] pointList) {         
        int maxDay = 0;         
        int distance = 0;      
        for(int k=0;k<pointList.length;k++) {      
            int day = ((int[][])pointList[k])[i][j];      
            distance += day;      
            if(maxDay<day) {      
                maxDay = day;      
            }      
        }      
        return new int[]{maxDay,distance};         
    }      
        
    public static void main(String[] args) throws IOException {      
        //数据输入      
        //数据输入格式：第一个数字是骑士n，第2，3个数字是第一个骑士的坐标，依次类推。      
        //每个数字之间以空格区分      
        BufferedReader stdin =       
            new BufferedReader(      
                new InputStreamReader(System.in));      
     
        String line = stdin.readLine();      
        StringTokenizer st = new StringTokenizer(line);      
        int pointLength = Integer.parseInt(st.nextToken());      
        Point[] points = new Point[pointLength];      
        for(int i=0;i<points.length;i++) {      
            int x = Integer.parseInt(st.nextToken());      
            int y = Integer.parseInt(st.nextToken());      
            points[i] = new Point(x,y);      
        }      
        Object[] pointList = new Object[points.length];      
        for (int j = 0; j < points.length; j++) {         
            pointList[j] = new Algo().distanceSq(points[j]);      
        }      
        int minDay = 999999999;      
        int minDistance = 999999999;        
        for(int i=0;i<7;i++) {      
            for(int j=0;j<7;j++) {      
                int[] result = Algo.method(points, i,j,pointList);         
                //找最短天数，最短天数相同，找最短距离      
                if (minDay > result[0]) {      
                    minDay = result[0];      
                    minDistance = result[1];      
                } else if(minDay == result[0]) {      
                    if(minDistance > result[1]) {      
                        minDistance = result[1];      
                    }      
                }      
            }      
        }      
        for(int i=0;i<7;i++) {      
            for(int j=0;j<7;j++) {      
                int[] result = Algo.method(points, i,j,pointList);    
                if(minDay == result[0] && minDistance == result[1]) {   
                    System.out.println(i+" " + j +" "+ minDay);   
                }   
            }   
        }    
    }      
}     






下面开始写数据结构的基本代码： 

1 节点类 

Java代码 
package graph;   
  
public class GraphNode {   
    public GraphNode link;   
    public int info;   
}  

package graph;

public class GraphNode {
	public GraphNode link;
	public int info;
}


2 邻接表表示图的链表类 

Java代码 
package graph;   
  
public class GraphList {   
  
    public GraphNode first;   
    public GraphNode last;   
    public boolean visitable;   
    public int getAjd(int[] ajd) {   
        GraphNode current = first;   
        int length = 0;   
        while(current != null) {   
            ajd[length++] = current.info;   
            current = current.link;   
        }   
        return length;   
    }   
    public void addNode(int v) {   
        GraphNode node = new GraphNode();   
        node.info = v;   
        if(first == null) {   
            first = node;   
            last = node;   
        } else {   
            last.link = node;   
            last = node;   
        }   
    }   
}  

package graph;

public class GraphList {

	public GraphNode first;
	public GraphNode last;
	public boolean visitable;
	public int getAjd(int[] ajd) {
		GraphNode current = first;
		int length = 0;
		while(current != null) {
			ajd[length++] = current.info;
			current = current.link;
		}
		return length;
	}
	public void addNode(int v) {
		GraphNode node = new GraphNode();
		node.info = v;
		if(first == null) {
			first = node;
			last = node;
		} else {
			last.link = node;
			last = node;
		}
	}
}


3 图类 



Java代码 
package graph;   
  
public class Graph {   
    private int length;   
    private GraphList[] list;   
    public Graph(int length) {   
        this.length = length;   
        list = new GraphList[length];   
    }   
       
    public void dfs(int v) {   
        int[] ajd = new int[length];   
        int ajdlength = list[v].getAjd(ajd);   
        list[v].visitable = true;   
        System.out.print(v+" ");   
        for(int i=0;i<ajdlength;i++) {   
            int w = ajd[i];   
            if(!list[w].visitable) {   
                dfs(w);   
            }   
        }   
    }   
       
    //深度优先遍历   
    public void dfsTravel() {   
        for(int i=0;i<length;i++) {   
            list[i].visitable = false;   
        }   
        for(int i=0;i<length;i++) {   
            if(!list[i].visitable) {   
                dfs(i);   
            }   
        }   
    }   
       
    //广度优先遍历   
    public void bfsTravel() {   
        for(int i=0;i<length;i++) {   
            list[i].visitable = false;   
        }   
        bfs();   
    }   
       
    private void bfs() {   
        Queue queue = new Queue();   
        for(int index=0;index<length;index++) {   
            if(!list[index].visitable) {   
                queue.addQueue(index);   
                list[index].visitable = true;   
                System.out.print(index+" ");   
                while(!queue.isEmpty()) {   
                    int temp = queue.front();   
                    queue.deleteQueue();   
                    int[] adj = new int[length];   
                    int ajdlength = list[temp].getAjd(adj);   
                    for(int i=0;i<ajdlength;i++) {   
                        int w = adj[i];   
                        if(!list[w].visitable) {                               
                            System.out.print(w+" ");   
                            queue.addQueue(w);   
                            list[w].visitable = true;   
                        }   
                    }   
                }   
            }   
               
        }   
    }   
       
    //长度   
    public void length() {   
        System.out.println(length);   
    }   
       
    public boolean isEmpty() {   
        return length == 0;   
    }   
       
    //添加节点   
    public void addGraph(int info) {   
        for(int i=0;i<length;i++) {   
            if(list[i] == null) {   
                GraphList g = new GraphList();   
                g.addNode(info);   
                list[i] = g;   
                break;   
            }   
        }   
    }   
       
    //添加边   
    public void addSide(int vfrom,int vto) {   
        list[vfrom].addNode(vto);   
    }   
       
    //打印图   
    public void print() {   
        for(int i=0;i<length;i++) {   
            GraphNode current = list[i].first;   
            while(current != null) {   
                System.out.print(current.info+" ");   
                current = current.link;   
            }   
            System.out.println();   
        }   
    }   
       
    public static void main(String[] args) {   
        Graph graph = new Graph(11);   
        System.out.println("create graph start");   
        for(int i=0;i<11;i++) {   
            graph.addGraph(i);   
        }   
        graph.addSide(0, 1);   
        graph.addSide(0, 5);   
        graph.addSide(1, 2);   
        graph.addSide(1, 3);   
        graph.addSide(1, 5);   
        graph.addSide(2, 4);   
        graph.addSide(4, 3);   
        graph.addSide(5, 6);           
        graph.addSide(6, 8 );   
        graph.addSide(7, 3);   
        graph.addSide(7, 8 );   
        graph.addSide(8, 10);   
        graph.addSide(9, 4);   
        graph.addSide(9, 7);   
        graph.addSide(9, 10);   
        graph.print();   
        System.out.println("create graph end");   
        graph.bfsTravel();   
    }   
  
}  

package graph;

public class Graph {
	private int length;
	private GraphList[] list;
	public Graph(int length) {
		this.length = length;
		list = new GraphList[length];
	}
	
	public void dfs(int v) {
		int[] ajd = new int[length];
		int ajdlength = list[v].getAjd(ajd);
		list[v].visitable = true;
		System.out.print(v+" ");
		for(int i=0;i<ajdlength;i++) {
			int w = ajd[i];
			if(!list[w].visitable) {
				dfs(w);
			}
		}
	}
	
	//深度优先遍历
	public void dfsTravel() {
		for(int i=0;i<length;i++) {
			list[i].visitable = false;
		}
		for(int i=0;i<length;i++) {
			if(!list[i].visitable) {
				dfs(i);
			}
		}
	}
	
	//广度优先遍历
	public void bfsTravel() {
		for(int i=0;i<length;i++) {
			list[i].visitable = false;
		}
		bfs();
	}
	
	private void bfs() {
		Queue queue = new Queue();
		for(int index=0;index<length;index++) {
			if(!list[index].visitable) {
				queue.addQueue(index);
				list[index].visitable = true;
				System.out.print(index+" ");
				while(!queue.isEmpty()) {
					int temp = queue.front();
					queue.deleteQueue();
					int[] adj = new int[length];
					int ajdlength = list[temp].getAjd(adj);
					for(int i=0;i<ajdlength;i++) {
						int w = adj[i];
						if(!list[w].visitable) {							
							System.out.print(w+" ");
							queue.addQueue(w);
							list[w].visitable = true;
						}
					}
				}
			}
			
		}
	}
	
	//长度
	public void length() {
		System.out.println(length);
	}
	
	public boolean isEmpty() {
		return length == 0;
	}
	
	//添加节点
	public void addGraph(int info) {
		for(int i=0;i<length;i++) {
			if(list[i] == null) {
				GraphList g = new GraphList();
				g.addNode(info);
				list[i] = g;
				break;
			}
		}
	}
	
	//添加边
	public void addSide(int vfrom,int vto) {
		list[vfrom].addNode(vto);
	}
	
	//打印图
	public void print() {
		for(int i=0;i<length;i++) {
			GraphNode current = list[i].first;
			while(current != null) {
				System.out.print(current.info+" ");
				current = current.link;
			}
			System.out.println();
		}
	}
	
	public static void main(String[] args) {
		Graph graph = new Graph(11);
		System.out.println("create graph start");
		for(int i=0;i<11;i++) {
			graph.addGraph(i);
		}
		graph.addSide(0, 1);
		graph.addSide(0, 5);
		graph.addSide(1, 2);
		graph.addSide(1, 3);
		graph.addSide(1, 5);
		graph.addSide(2, 4);
		graph.addSide(4, 3);
		graph.addSide(5, 6);		
		graph.addSide(6, 8 );
		graph.addSide(7, 3);
		graph.addSide(7, 8 );
		graph.addSide(8, 10);
		graph.addSide(9, 4);
		graph.addSide(9, 7);
		graph.addSide(9, 10);
		graph.print();
		System.out.println("create graph end");
		graph.bfsTravel();
	}

}


4 队列 


Java代码 
package graph;   
  
public class Queue {   
    public GraphNode first;   
    public GraphNode last;   
    public int count;   
    public void addQueue(int info) {   
        GraphNode node = new GraphNode();   
        node.info = info;   
        if(first == null) {   
            first = node;   
            last = node;   
        } else {   
            last.link = node;   
            last = last.link;   
        }   
        count++;   
    }    
       
    public void deleteQueue() {   
        if(first == null) {   
            System.out.println("null queue");   
        } else {   
            first = first.link;   
            count--;   
        }   
    }   
       
    public boolean isEmpty() {   
        return count == 0;   
    }   
       
    public int front() {   
        if(first == null) {   
            return -1;   
        }   
        return first.info;   
    }   
       
    public int back() {   
        if(last == null) {   
            return -1;   
        }   
        return last.info;   
    }   
}  

package graph;

public class Queue {
	public GraphNode first;
	public GraphNode last;
	public int count;
	public void addQueue(int info) {
		GraphNode node = new GraphNode();
		node.info = info;
		if(first == null) {
			first = node;
			last = node;
		} else {
			last.link = node;
			last = last.link;
		}
		count++;
	} 
	
	public void deleteQueue() {
		if(first == null) {
			System.out.println("null queue");
		} else {
			first = first.link;
			count--;
		}
	}
	
	public boolean isEmpty() {
		return count == 0;
	}
	
	public int front() {
		if(first == null) {
			return -1;
		}
		return first.info;
	}
	
	public int back() {
		if(last == null) {
			return -1;
		}
		return last.info;
	}
}


5 堆栈 


Java代码 
package graph;   
  
public class Stack {   
    public GraphNode stackTop;   
    public int count;   
    public void push(int info) {   
        GraphNode node = new GraphNode();   
        node.info = info;   
        node.link = stackTop;   
        stackTop = node;   
        count++;   
    }    
       
    public void pop() {   
        if(stackTop == null) {   
            System.out.println("null stack");   
        } else {   
            stackTop = stackTop.link;   
            count--;   
        }   
  
    }   
       
    public int top() {   
        if(stackTop == null) {   
            return -1;   
        }   
        return stackTop.info;   
    }   
  
}  

package graph;

public class Stack {
	public GraphNode stackTop;
	public int count;
	public void push(int info) {
		GraphNode node = new GraphNode();
		node.info = info;
		node.link = stackTop;
		stackTop = node;
		count++;
	} 
	
	public void pop() {
		if(stackTop == null) {
			System.out.println("null stack");
		} else {
			stackTop = stackTop.link;
			count--;
		}

	}
	
	public int top() {
		if(stackTop == null) {
			return -1;
		}
		return stackTop.info;
	}

}


6 图的最短路径算法 


Java代码 
package graph;   
  
public class Graph {   
    private int length;   
    private GraphList[] list;   
    private int[][] weight;   
  
    public Graph(int length) {   
        this.length = length;   
        list = new GraphList[length];   
        weight = new int[length][length];   
    }   
  
    public void dfs(int v) {   
        int[] ajd = new int[length];   
        int ajdlength = list[v].getAjd(ajd);   
        list[v].visitable = true;   
        System.out.print(v + " ");   
        for (int i = 0; i < ajdlength; i++) {   
            int w = ajd[i];   
            if (!list[w].visitable) {   
                dfs(w);   
            }   
        }   
    }   
  
    // 深度优先遍历   
    public void dfsTravel() {   
        for (int i = 0; i < length; i++) {   
            list[i].visitable = false;   
        }   
        for (int i = 0; i < length; i++) {   
            if (!list[i].visitable) {   
                dfs(i);   
            }   
        }   
    }   
  
    // 广度优先遍历   
    public void bfsTravel() {   
        for (int i = 0; i < length; i++) {   
            list[i].visitable = false;   
        }   
        bfs();   
    }   
  
    private void bfs() {   
        Queue queue = new Queue();   
        for (int index = 0; index < length; index++) {   
            if (!list[index].visitable) {   
                queue.addQueue(index);   
                list[index].visitable = true;   
                System.out.print(index + " ");   
                while (!queue.isEmpty()) {   
                    int temp = queue.front();   
                    queue.deleteQueue();   
                    int[] ajd = new int[length];   
                    int ajdlength = list[temp].getAjd(ajd);   
                    for (int i = 0; i < ajdlength; i++) {   
                        int w = ajd[i];   
                        if (!list[w].visitable) {   
                            System.out.print(w + " ");   
                            queue.addQueue(w);   
                            list[w].visitable = true;   
                        }   
                    }   
                }   
            }   
  
        }   
    }   
  
    // 最短路径   
    private int[] shortPath(int v) {   
        int[] shortPath = new int[length];   
        boolean[] weightFound = new boolean[length];   
        for (int i = 0; i < length; i++) {   
            // 趋近无穷   
            shortPath[i] = 9999;   
            weightFound[i] = false;   
        }   
        shortPath[v] = 0;   
        weightFound[v] = true;   
        Queue queue = new Queue();   
        queue.addQueue(v);   
        while (!queue.isEmpty()) {   
            int temp = queue.front();   
            queue.deleteQueue();   
            int[] ajd = new int[length];   
            int ajdlength = list[temp].getAjd(ajd);   
            for (int i = 0; i < ajdlength; i++) {   
                int w = ajd[i];   
                if (!weightFound[w]) {   
                    if (shortPath[w] > shortPath[temp] + weight[temp][w]) {   
                        shortPath[w] = shortPath[temp] + weight[temp][w];   
                    }   
                }   
            }   
            int minWeightNode = 0;   
            for (int i = 0; i < length; i++) {   
                if (!weightFound[i]) {   
                    minWeightNode = i;   
                    for (int j = 0; j < length; j++) {   
                        if (!weightFound[j]) {   
                            if (shortPath[j] < shortPath[minWeightNode]) {   
                                minWeightNode = j;   
                            }   
                        }   
                    }   
                    break;   
                }   
            }   
            if (!weightFound[minWeightNode]) {   
                weightFound[minWeightNode] = true;   
                queue.addQueue(minWeightNode);   
            }   
        }   
        return shortPath;   
    }   
  
    // 长度   
    public void length() {   
        System.out.println(length);   
    }   
  
    public boolean isEmpty() {   
        return length == 0;   
    }   
  
    // 添加节点   
    public void addGraph(int info) {   
        for (int i = 0; i < length; i++) {   
            if (list[i] == null) {   
                GraphList g = new GraphList();   
                g.addNode(info);   
                list[i] = g;   
                break;   
            }   
        }   
    }   
  
    // 添加边   
    public void addSide(int vfrom, int vto, int value) {   
        list[vfrom].addNode(vto);   
        weight[vfrom][vto] = value;   
    }   
  
    // 打印图   
    public vo