java queue stack bintaryTree tree link数据结构

LINK(带头结点和不带头结点)

功能:实现插入、删除、反转(三种思想)

class LinkNode<Type> {
    Type data;
    LinkNode<Type> next;

    public LinkNode() {
        next = null;
    }

    public LinkNode(Type data) {
        this.data = data;
        next = null;
    }
}

class LinkList<Type> {
    private LinkNode<Type> first = null;

    public LinkList() {

    }

    public void insertNode(Type data) {
        LinkNode<Type> node = new LinkNode<Type>(data);

        if (first == null) {
            first = node;
        } else {
            node.next = first;
            first = node;
        }
    }

    public void deleteNode(Type data) {
        LinkNode<Type> tmp = first;

        if (first == null)
            return;

        if (tmp.data == data)
            first = tmp.next;

        while (tmp.next != null) {
            if (tmp.next.data == data) {
                tmp.next = tmp.next.next;
                return;// error mo return
            }

            tmp = tmp.next;
        }
    }

    public void showList() {
        LinkNode<Type> tmp = first;

        while (tmp != null) {
            System.out.print(tmp.data + " ");
            tmp = tmp.next;
        }
    }

    public void reverse1() {
        LinkNode<Type> pre, cur, last;

        if (first.next == null || first == null)
            return;

        cur = first;
        pre = null;

        while (cur != null) {
            last = cur.next;

            cur.next = pre;
            pre = cur;
            cur = last;
        }

        first = pre;
    }

    public void reverse2() {
        LinkNode<Type> cur = first, last;

        if (cur == null || cur.next == null)
            return;

        while (cur.next.next != null)
            cur = cur.next;

        last = cur.next;
        cur.next = null;

        reverse2();

        last.next = cur;
        first = last;
    }

    public void reverse3() {
        LinkNode<Type> cur, last;

        cur = first;

        if (cur == null || cur.next == null)
            return;

        last = cur.next;
        first = last;

        reverse3();

        last.next = cur;
        cur.next = null;
    }
}

class HLinkList<Type> {
    LinkNode<Type> head = new LinkNode<Type>();

    HLinkList() {

    }

    public void insetNode(Type data) {
        LinkNode<Type> node = new LinkNode<Type>(data);

        node.next = head.next;
        head.next = node;
    }

    public void showList() {
        LinkNode<Type> tmp;

        tmp = head.next;

        while (tmp != null) {
            System.out.print(tmp.data + " ");
            tmp = tmp.next;
        }
    }

    public void deleteNode(Type data) {
        LinkNode<Type> tmp = head;

        while (tmp.next != null) {
            if (tmp.next.data == data) {
                tmp.next = tmp.next.next;
                return;// error no return
            }

            tmp = tmp.next;
        }
    }

    public void reverse1() {
        LinkNode<Type> pre, cur, last;

        cur = head.next;
        pre = null;

        while (cur != null) {
            last = cur.next;

            cur.next = pre;
            pre = cur;
            cur = last;
        }

        head.next = pre;
    }

    public void reverse2() {
        LinkNode<Type> cur = head.next, last;

        if (cur == null || cur.next == null)
            return;

        while (cur.next.next != null)
            cur = cur.next;

        last = cur.next;
        cur.next = null;

        reverse2();

        last.next = cur;
        head.next = last;
    }

    public void reverse3() {
        LinkNode<Type> cur, last;

        cur = head.next;

        if (cur == null || cur.next == null)
            return;

        last = cur.next;
        head.next = last;

        reverse3();

        last.next = cur;
        cur.next = null;
    }
}

public class Link {
    public static void main(String[] args) {
        // Random random = new Random(90);

        // check
        // LinkList<Integer> link = new LinkList<Integer>();
        // for (int i = 0; i < 10; i++) {
        // link.insertNode(random.nextInt() % 100);
        // }
        //
        // link.showList();
        // System.out.println();
        //
        // link.deleteNode(1);
        // link.showList();
        // System.out.println();
        //
        // link.reverse1();
        // link.showList();
        // System.out.println();

        // check
        // HLinkList<Integer> hlink = new HLinkList<Integer>();
        // for (int i = 0; i < 10; i++)
        // hlink.insetNode(random.nextInt() % 100);
        //
        // hlink.showList();
        // System.out.println();
        //
        // hlink.deleteNode(-17);
        // hlink.showList();
        // System.out.println();
        //
        // hlink.reverse3();
        // hlink.showList();
    }
}

STACK(顺序栈和链式栈)

功能:压栈,出栈

//sequence
class SeqStack<Type> {
    private Type[] data;
    private int sp;
    private int size;

    public SeqStack(Type[] data) {
        this.data = data;
        sp = 0;
        size = data.length;
    }

    public boolean isEmpty() {
        return sp == 0;
    }

    public boolean isPull() {
        return sp == size;
    }

    public Type pop() {
        if (isEmpty())
            return null;

        sp--;
        return this.data[sp];
    }

    public void push(Type data) {
        if (isPull())
            return;

        this.data[sp] = data;
        sp++;
    }
}

// link
class LinkStack<Type> {
    class LinkStackNode {
        private Type data;
        private LinkStackNode next;

        public LinkStackNode(Type data) {
            this.data = data;
            next = null;
        }

        public LinkStackNode() {
            next = null;
        }
    }

    private LinkStackNode sp = new LinkStackNode();

    public boolean isEmpty() {
        return sp.next == null;
    }

    public Type pop() {
        Type data;

        if (isEmpty())
            return null;

        data = sp.next.data;
        sp.next = sp.next.next;

        return data;
    }

    public void push(Type data) {
        LinkStackNode node = new LinkStackNode(data);

        node.next = sp.next;
        sp.next = node;
    }
}

public class Stack {
    public static void main(String[] args) {
        
    }
}

QUEUE(顺序队列与链式队列)

功能:入队,出队。

class SequenceQueue<Type> {
    Type[] data;
    int front;
    int rear;
    int size;

    public SequenceQueue(Type[] data) {
        this.data = data;
        front = 0;
        rear = 0;
        size = data.length;
    }

    private boolean isEmpty() {
        return front == rear;
    }

    private boolean isPull() {
        return (rear + 1) % size == front;
    }

    public void enQueue(Type data) {
        if (isPull())
            return;

        this.data[rear] = data;
        rear++;
        rear %= size;
    }

    public Type deQueue() {
        Type data;

        if (isEmpty())
            return null;

        data = this.data[front];
        front++;
        front %= size;

        return data;
    }
}

class LinkQueue<Type> {
    class LinkQueueNode {
        Type data;
        LinkQueueNode next;

        public LinkQueueNode(Type data) {
            this.data = data;
            next = null;
        }

        public LinkQueueNode() {
            next = null;
        }
    }

    LinkQueueNode front;
    LinkQueueNode rear;

    private boolean isEmpty() {
        return front == null;
    }

    public void enQueue(Type data) {
        LinkQueueNode node = new LinkQueueNode(data);

        if (front == null)
            front = node;
        else
            rear.next = node;
        
        rear = node;
    }

    public Type deQueue() {
        Type data;
        
        if (isEmpty())
            return null;
        
        data = front.data;
        front = front.next;
        
        return data;
    }
}

public class Queue {
    public static void main(String[] args) {

    }
}

BINARYTREE

功能:三种遍历与广度、深度遍历。
class BinTreeNode<Type> {
    Type data;
    BinTreeNode<Type> left;
    BinTreeNode<Type> right;

    public BinTreeNode() {
        left = null;
        right = null;
    }

    public BinTreeNode(Type data) {
        this.data = data;
        left = null;
        right = null;
    }
}

interface NodeHandler<Type> {
    void visit(BinTreeNode<Type> node);
}

class BinTree<Type> {
    private BinTreeNode<Type> root;

    private BinTreeNode<Type> createTree(int level) {
        BinTreeNode<Type> root = new BinTreeNode<Type>();

        if (level < 0)
            return null;

        root.left = createTree(level - 1);
        root.right = createTree(level - 1);

        return root;
    }

    private void traversePreOrder(BinTreeNode<Type> root,
            NodeHandler<Type> handle) {
        BinTreeNode<Type> left, right;

        if (root == null)
            return;

        left = root.left;
        right = root.right;

        handle.visit(root);
        traversePreOrder(left, handle);
        traversePreOrder(right, handle);
    }

    private void traverseInOrder(BinTreeNode<Type> root,
            NodeHandler<Type> handle) {
        BinTreeNode<Type> left, right;

        if (root == null)
            return;

        left = root.left;
        right = root.right;

        traversePreOrder(left, handle);
        handle.visit(root);
        traversePreOrder(right, handle);
    }

    private void traversePostOrder(BinTreeNode<Type> root,
            NodeHandler<Type> handle) {
        BinTreeNode<Type> left, right;

        if (root == null)
            return;

        left = root.left;
        right = root.right;

        traversePreOrder(left, handle);
        handle.visit(root);
        traversePreOrder(right, handle);
    }

    private void traverseStack(BinTreeNode<Type> root, NodeHandler<Type> handle) {
        LinkStack<BinTreeNode<Type>> stack = new LinkStack<BinTreeNode<Type>>();
        BinTreeNode<Type> node;

        stack.push(root);
        while ((node = stack.pop()) != null) {
            if (node.right != null)
                stack.push(node.right);
            if (node.left != null)
                stack.push(node.left);

            handle.visit(node);
        }
    }

    private void traverseQueue(BinTreeNode<Type> root, NodeHandler<Type> handle) {
        LinkQueue<BinTreeNode<Type>> queue = new LinkQueue<BinTreeNode<Type>>();
        BinTreeNode<Type> node;

        queue.enQueue(root);
        while ((node = queue.deQueue()) != null) {
            if (node.left != null)
                queue.enQueue(node.left);
            if (node.right != null)
                queue.enQueue(node.right);

            handle.visit(node);
        }
    }

    public BinTree(int level) {
        root = createTree(level);
    }

    public void PreOrder(NodeHandler<Type> handler) {
        traversePreOrder(root, handler);
    }

    public void InOrder(NodeHandler<Type> handler) {
        traverseInOrder(root, handler);
    }

    public void PostOrder(NodeHandler<Type> handler) {
        traversePostOrder(root, handler);
    }

    public void StackOrder(NodeHandler<Type> handler) {
        traverseStack(root, handler);
    }

    public void QueueOrder(NodeHandler<Type> handler) {
        traverseQueue(root, handler);
    }
}

public class BinaryTree {
    public static void main(String[] args) {
            
    }
}

 

TREE(普通树)

功能:前后两种遍历与广度深度遍历。

import java.util.Random;

class TreeNode<Type> {
    Type data;
    TreeNode<Type> child;
    TreeNode<Type> sibling;

    public TreeNode(Type data) {
        this.data = data;
        child = null;
        sibling = null;
    }

    public TreeNode() {
        child = null;
        sibling = null;
    }
}

interface NodeHandle<Type> {
    void visit(TreeNode<Type> node);
}

class Tree<Type> {
    private TreeNode<Type> root;

    Tree(int level) {
        root = createTree(level);
    }

    private TreeNode<Type> createTree(int level) {
        TreeNode<Type> root = new TreeNode<Type>();
        TreeNode<Type> child;
        Random random = new Random();
        int n = random.nextInt(3);

        if (level < 0)
            return null;

        if (n == 0 || level == 0)
            return root;

        root.child = createTree(level - 1);
        child = root.child;

        for (int i = 0; i < n - 1; i++) {
            child.sibling = createTree(level - 1);

            if (child.sibling == null)
                continue;

            child = child.sibling;
        }

        return root;
    }

    private void traversePre(TreeNode<Type> root, NodeHandle<Type> handle) {
        TreeNode<Type> node;

        if (root == null)
            return;

        handle.visit(root);

        node = root.child;
        while (node != null) {
            traversePre(node.child, handle);
            node = node.sibling;
        }
    }

    private void traversePost(TreeNode<Type> root, NodeHandle<Type> handle) {
        TreeNode<Type> node;

        if (root == null)
            return;

        node = root.child;
        while (node != null) {
            traversePost(node.child, handle);
            node = node.sibling;
        }

        handle.visit(root);
    }

    private void traverseStack(TreeNode<Type> root, NodeHandle<Type> handle) {
        LinkStack<TreeNode<Type>> stack = new LinkStack<TreeNode<Type>>();
        TreeNode<Type> node, child;

        stack.push(root);

        while ((node = stack.pop()) != null) {
            handle.visit(node);

            child = node.child;
            while (child != null) {
                stack.push(child);
                child = child.sibling;
            }
        }
    }

    private void traverseQueue(TreeNode<Type> root, NodeHandle<Type> handle) {
        LinkQueue<TreeNode<Type>> stack = new LinkQueue<TreeNode<Type>>();
        TreeNode<Type> node, child;

        stack.enQueue(root);

        while ((node = stack.deQueue()) != null) {
            handle.visit(node);

            child = node.child;
            while (child != null) {
                stack.enQueue(child);
                child = child.sibling;
            }
        }
    }

    public void preOrder(NodeHandle<Type> handle) {
        traversePre(root, handle);
    }

    public void postOrder(NodeHandle<Type> handle) {
        traversePost(root, handle);
    }

    public void stackOrder(NodeHandle<Type> handle) {
        traverseStack(root, handle);
    }

    public void queueOrder(NodeHandle<Type> handle) {
        traverseQueue(root, handle);
    }

}

public class tree {
    public static void main(String[] args) {

    }
}

转载于:https://www.cnblogs.com/bird-z/archive/2012/09/02/2667941.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值