JAVA数据结构实现

JAVA单链表实现

#单链表的数据结构
public singleLinkedList(){
    private int size;
    private Node head;
    
    public singleLInkedList(){
        this.size = 0;
        this.head = Null;
    }
    private class Node(Object data){
        Object data;
        Node next;
        public Node(Object data){
            this.data = data;
        }
        
    }
    //添加头节点
    public Object addHeadNode(Object data){
        Node newHead = new Node(data);
        if(size == 0) head = newHead;
        else{
            newHead.next = head;
            head = neaHead;
        }
        size++;
        return data;
    }
    //在头部删除元素
    public Object deleteHeadNode(){
        Object data = head.data;
        head = head.next;
        size--;
        return data;
    }
    //查找指定元素,找到了返回Node,找不到返回Null
    public Node find(Object data){
        //设定指针遍历
        Node current = head;
        while(current != null){
            if(current.next.data == data) return curren
            else current = current.next;
        }
        return null;
    }
    //删除指定的元素,删除成功返回true
    public boolean delete(Object data){
        Node curren = head;
        while(current.next.data!=data&&current.next!=null){
            current = current.next;
        }
        if(current.next != null){
            current.next = current.next.next;
            size--;
            return true;
        }
        else return false;
    }
    //判断链表是否未空
    public boolean isEmpty(){
        if(size>0) return false;
        else return true;
    }
}

 =================================================

 二叉树

//节点类
Class Node{
    Object data;
    Node leftChild;
    Node rightChild;
    
    public Node(Object data){
        this.data = data;
    }
}
//二叉树类
class BinaryTree{
    private Node root = null;
    public BinaryTree(Object data){
        root = new Node(data);
        root.leftChild = null;
        root.rightChild = null;
    }
    
    public Node getRoot(){
        return root;
    }
    //先序遍历查找
    public Node findKey(Node node,Object key){
        if(node == null) return null;
        if(node.data == key) return node;
        findKey(node.leftChild,key);
        findKey(node.rightChild,key);
    }
    
    //先序遍历
    public void preOrder(Node node){
        if(node){
            System.out.println(node.data);
            preOrder(node.leftChild);
            preOrder(node.leftChild);
        }
    }
    //后序
    //中序...
    //树的深度
    public int getDepth(Node node){
        if (node == null) return 0;
        else{
            int left = getDepth(node.leftChild);
            int right = getDepth(node.rightChild);
            if(left>right) return left+1;
            else return right+1;
        }
    }
    //二叉树中节点个数
    public int getNodeCount(Node node){
        if(node == null) return 0;
        else{
            int left = getNodeCount(node.leftChild);
            int right = getNodeCount(node.rightChild);
            return lef+right+1;
        }
    }
    //二叉树叶子节点数
    public int getLeavsCount(Node node){
        if(node == null) return 0;
        if(node.leftChild == null && node.rightChild = null) return 1;
        else{
            left = getLeavsCount(node.leftChild);
            right = getLeavsCount(node.rightChild);
            return left+right;
        }
    }
    //计算二叉树度为1的节点
    public int getNode1Count(Node node){
        if(node == null ) return 0;
        if((node.leftChild != null && node.rightChild == null )|| (node.lefChild == null&& node.rightChild != null))
        {
            return 1;
        }
        else{
            left = getNode1Count(node.leftChild);
            rigth = getNode1Count(node.rightChild);
            return left+right;
        }
    }
    //交换左右节点,先序,后序都可以
    public void ExchangeTree(Node node){
        if(node){
            Node temp = new Node();
            temp = node.rightChild;
            node.rigthChild = node.leftChild;
            node.leftChild = temp;
            ExchangeTree(node.leftChild);
            ExchangeTree(node.rightChild);
            
        }
    }
    //层次遍历二叉树
    //层次遍历二叉树,用队列实现,JAVA队列可以用LinkedList pull,add方法实现,或者直接用Queue
    public void leveOrder(Node node){
        if(node){
            Queue<Node> queue = new Queue<Node>();
            queue.add(node);
            while(!queue.isEmpty()){
                Node cur = queue.poll();
                System.out.print(cur.data);
                if(cur.leftChild != null) queue.add(cur.leftChild);
                if(cur.rightChild != null) queue.add(cur.rightChuld);
            }
        }
    }
}

 二叉查找树

#二叉查找树
private class Node(){
    Object data;
    Node leftChild;
    Node rightChild;
    public Node(Object data){
        this.data = data
        this.leftChild = null;
        this.rightChild = null;
    }
}
public class BinarySearchTree(){
    Node root;
    public BinarySearchTree(){
        root = null;
    }
    //contains
    public boolean contains(Object data,Node t){
        if(t == null) return false;
        else{
            if(t.data < data) return contains(x,t.rightChild);
            if(t.data > data) return contains(x,t.leftChild);
            else return true;
        }
    }
    public Node insert(Object data,Node t){
        if(t == null){
            Node node = new Node(data);
            return node;
        }
        if(t.data > data) return insert(data,t.leftChild);
        if(t.data < data) return insert(data,t.leftChild);
        else return t;
    }
    public Node findMin(Node t){
        if(t == null) return nll;
        else{
            if(t.leftChild == null) return t;
            else return findMin(t.leftChild);
        }
    }
    public Node findMax(node t){
        if(t == null) return null;
        else{
            if(t.rightChild == null) return t;
            else return findMin(t.rightChild);
        }
    }
}

 

posted @ 2018-10-30 14:33  jellyj  阅读(232)  评论(0编辑  收藏  举报