算法系列02

/**
 * 递归:在方法体重调用本身这个方法
 **/
public class DiGui {
    public static void main(String[] args) {
        DiGui.test(0);
    }
    public static void test(int value){
        if(value<100){
            System.out.println("第一步:"+value);
            test(++value);
            System.out.println("第二步:"+value);
            System.out.println("第三步:"+value);
        }
    }

}

---------------------------------------------------------------------------------------------------------------------------------

/**
     * 三角数字:数列中第1项为1,第n项由n-1项加n得到
     **/
    public class SanJiao {
        public static void main(String[] args) {
            //System.out.println(SanJiao(1));
            //System.out.println(SanJiao(2));
            //System.out.println(SanJiao(3));
            //System.out.println(SanJiao(4));


            System.out.println(DiGuiSanJiao(1));
            System.out.println(DiGuiSanJiao(2));
            System.out.println(DiGuiSanJiao(3));
            System.out.println(DiGuiSanJiao(4));
        }

        public static int SanJiao(int n){
            int total=0;
            while (n>0){
                total=total+n;
                n--;
            }
            return total;
        }


        public static int DiGuiSanJiao(int n){
            if(n==1){
                return 1;
            }else{
                return n+DiGuiSanJiao(--n);
            }
        }


------------------------------------------------------------------------------------------------------------------------------

/**
 * Fibonacci数列中第1,2项为1,第n项由n-1项加n-2项得到
 **/
public class TestFibonacci {

    public static void main(String[] args) {
        System.out.println(Fibonacci(1));
        System.out.println(Fibonacci(2));
        System.out.println(Fibonacci(3));
        System.out.println(Fibonacci(4));
        System.out.println(Fibonacci(5));
        System.out.println(Fibonacci(6));
    }


    public static int Fibonacci(int n){
        if(n==1){
            return 1;
        }else if(n==2){
            return 1;
        }else {
            return Fibonacci(n-1)+Fibonacci(n-2);
        }
    }
}

    }


------------------------------------------------------------------------------------------------------------------------------


/**
 * 核心思想:链接点中包含一个数据域和一个指针域,其中数据域用来包装数据,而指针域用来指向下一个链接点
 **/
public class Link {
    private long data;
    private Link next;
    public Link(long data) {
        this.data = data;
    }
    public long getData() {
        return data;
    }
    public void setData(long data) {
        this.data = data;
    }
    public Link getNext() {
        return next;
    }
    public void setNext(Link next) {
        this.next = next;
    }
    /*public static void main(String[] args) {
        Link link1 = new Link(10);
        Link link2 = new Link(30);
        Link link3 = new Link(100);
        Link link4 = new Link(20);


        link1.setNext(link2);
        link2.setNext(link3);
        link3.setNext(link4);

        System.out.println(link1.getData());
        System.out.println(link1.getNext().getData());

    }*/

}

/**
 * 链表:链表中只包含一个数据项,即对第一个链接点的引用
 **/
public class LinkList {
   private Link first;
   public void insert(long value){
       Link link=new Link(value);
       if(first==null){
           first=link;
       }else{
           link.setNext(first);
            first=link;
       }
   }

   public void displayAll(){
       Link current=first;
       while (current!=null){
           System.out.println(current.getData());
           current=current.getNext();
       }
   }

   public Link find(long data){
       Link current=first;
       while (current.getData()!=data){
           if(current.getNext()==null){
               return null;
           }
           current=current.getNext();
       }
       return current;
   }

   public void insert(long data,int pos){
       if(pos==0){
           this.insert(data);
       }else{
           Link current=first;
           for (int j=0;j<pos-1;j++){
               current=current.getNext();
           }
           Link link=new Link(data);
           link.setNext(current.getNext());
           current.setNext(link);
       }
   }

   public void delete(long data){
       Link current = first;
       Link ago = first;


       while (current.getData()!=data){
           if(current.getNext() == null) {
               return;
           } else {
               ago = current;
               current = current.getNext();
           }
       }


       if(current==first){
           first=first.getNext();
       }else{
           ago.setNext(current.getNext());
       }
   }

    public static void main(String[] args) {
        LinkList linkList = new LinkList();
        linkList.insert(40);
        linkList.insert(12);
        linkList.insert(23);
        linkList.insert(10);

        linkList.displayAll();
        System.out.println("找到结点,数据为 "+linkList.find(23).getData());

        linkList.insert(20, 0);
        System.out.println("-----------------------");
        linkList.displayAll();

        linkList.delete(12);
        System.out.println("-----------------------");
        linkList.displayAll();
    }

}

------------------------------------------------------------------------------------------------------------------------------

/**
 * 在优先级队列中,数据项按关键字的值有序,这样关键字最小的数据项(或者最大)总是在队头,
 * 数据项插入时会按照顺序插入到合适的位置,确保队列的顺序
 **/
public class PriorityQueue {
    private long[] arr;
    private int maxSize;
    private int elems;
    public PriorityQueue(int maxSize){
        this.maxSize=maxSize;
        arr=new long[maxSize];
        elems=0;
    }

    public void insert(long value) {
        int i;
        for (i = 0;  i < elems; i++) {
            if(value < arr[i]) {
                break;
            }
        }
        System.out.println("i:"+i);
        for(int j = elems; j > i;j--){
            arr[j] = arr[j - 1];
        }
        arr[i] = value;
        elems++;
    }
    public long remove() {
        long value = arr[elems - 1];
        elems--;
        return value;
    }
    public boolean isEmpty() {
        return (elems == 0);
    }
    public boolean isFull() {
        return (elems == maxSize);
    }
    public int size() {
        return elems;
    }
    /*public static void main(String[] args) {
        PriorityQueue priorityQueue = new PriorityQueue(30);
        priorityQueue.insert(20);
        priorityQueue.insert(15);
        priorityQueue.insert(30);
        while (!priorityQueue.isEmpty()){
            long value = priorityQueue.remove();
            System.out.print(value + " ");
        }
    }*/
}


------------------------------------------------------------------------------------------------------------------------------


public class Node {
    //关键字
    private int keyData;
    //其他数据
    private int otherData;
    //左子节点
    private Node leftNode;
    //右子节点
    private Node rightNode;

    public Node(int keyData, int otherData) {
        this.keyData = keyData;
        this.otherData = otherData;
    }
    public int getKeyData() {
        return keyData;
    }
    public void setKeyData(int keyData) {
        this.keyData = keyData;
    }
    public int getOtherData() {
        return otherData;
    }
    public void setOtherData(int otherData) {
        this.otherData = otherData;
    }
    public Node getLeftNode() {
        return leftNode;
    }
    public void setLeftNode(Node leftNode) {
        this.leftNode = leftNode;
    }

    public Node getRightNode() {
        return rightNode;
    }

    public void setRightNode(Node rightNode) {
        this.rightNode = rightNode;
    }
    //显示方法
    public void display(){
        System.out.println(keyData+","+otherData);
    }
}

/**
 * 二叉树:树中每个节点最多只能有两个子节点
 * 插入节点:1.如果不存在节点,则直接插入。
 * 2.从根开始查找一个相应的节点,即新节点的父节点,当父节点找到后,根据新节点的值来确定新节点是连接到左子节点还是右子节点
 *
 * 查找节点:从根开始查找,如果查找节点值比父节点要小,则查找其左子树,否则查找其右子树,直到查找到为止,如果不存在节点,则返回null
 * 修改节点:首先查找节点,找到相应节点后,再进行修改。
 * 遍历二叉树:遍历二叉树分为三种方法,一种先序遍历,一种中序遍历,一种后序遍历
 * 前序遍历:根节点->左子树->右子树
 *
 *  中序遍历:左子树->根节点->右子树
 *
 * 后序遍历:左子树->右子树->根节点
 **/
public class Tree {
    //根
    private Node root;
    //插入节点
    public void insert(int keyData,int otherData){
        Node newNode = new Node(keyData, otherData);
        //如果说没有节点
        if(root==null){
            root=newNode;
        }else{
            Node current=root;
            Node parent;
            while (true){
                parent=current;
                if(keyData < current.getKeyData()){
                    current=current.getLeftNode();
                    if(current == null){
                        parent.setLeftNode(newNode);
                        return;
                    }
                }else {
                    current=current.getRightNode();
                    if(current == null){
                        parent.setRightNode(newNode);
                        return;
                    }
                }
            }
        }
    }
    //查找
    public Node find(int keyData){
        Node current=root;
        while (current.getKeyData() != keyData){
            if(keyData < current.getKeyData()){
                current=current.getLeftNode();
            }else{
                current=current.getRightNode();
            }
            if(current == null){
                return null;
            }
        }
        return current;
    }
    //修改方法
    public void change(int keyData, int newOtherData){
        Node findNode = find(keyData);
        findNode.setOtherData(newOtherData);
    }
    //先序遍历
    public void preOrder(Node node) {
        if (node != null) {
            node.display();
            preOrder(node.getLeftNode());
            preOrder(node.getRightNode());
        }
    }
    // 中序遍历
    public void inOrder(Node node) {
        if (node != null) {
            inOrder(node.getLeftNode());
            node.display();
            inOrder(node.getRightNode());
        }
    }
    // 后序遍历
    public void endOrder(Node node) {
        if (node != null) {
            endOrder(node.getLeftNode());
            endOrder(node.getRightNode());
            node.display();
        }
    }

    public Node getRoot() {
        return root;
    }
    public void setRoot(Node root) {
        this.root = root;
    }
    public static void main(String[] args) {
        Tree tree = new Tree();
        tree.insert(10,23);
        tree.insert(7,17);
        tree.insert(18,28);
        tree.insert(12,22);

        tree.preOrder(tree.getRoot());
        System.out.println("-----------");
        tree.inOrder(tree.getRoot());
        System.out.println("-----------");
        tree.endOrder(tree.getRoot());
    }
}

------------------------------------------------------------------------------------------------------------------------------

未完待续!



猜你喜欢

转载自blog.csdn.net/qq_19968255/article/details/80722233