用Java代码实现链表和二叉树

链表

class Link {

    private class Node {
        Object value; // 数据域
        Node next; // 指针域
        public Node(Object value) {
            this.value = value;
        }
    }

    private Node head;
    private Node tail;
    private int size;

    public void add(Object obj) {
        Node newNode = new Node(obj);
        if (head == null) {
            head = newNode;
            tail = newNode;
        } else {
            tail.next = newNode;
            tail = newNode;
        }
        size++;
    }

    public void travel() {
        Node tmp = head;
        while (tmp != null) {
            System.out.println(tmp.value);
            tmp = tmp.next;
        }
    }

    public int size() {
        /*
        int size = 0;
        Node tmp = head;
        while (tmp != null) {
            size++;
            tmp = tmp.next;
        }*/
        return size;
    }

    public boolean remove(Object obj) {
        if (head.value.equals(obj)) { // 先判断是否删除的是头
            head = head.next;
            size--;
            return true;
        }
        Node prev = head;
        while (prev.next != null) { // 用于检索要删除的目标结点的前一个
            if (prev.next.value.equals(obj)) { // 判断的是prev.下一个节点的值
                // 真正删除它
                if (prev.next == tail) { // 如果删除的是尾结点, 必须让尾变化
                    tail = prev;
                }
                prev.next = prev.next.next; // 把要删除目标结点的后面的结点的地址写入前一个结点中.
                size--;
                return true;
            }
            prev = prev.next; // 如果判断失败, 继续右移指针.
        }
        return false;
    }
}

public class LinkTest {

    public static void main(String[] args) {
        Link link = new Link();
        link.add("yy");
        link.add("abc");
        link.add("aa");
        link.add("aa");
        link.add("cc");
        link.add("qq");
        link.add("zz");
        link.add("pp");
        link.add("aa");
        link.add("xx");

        link.travel();

        System.out.println("********************");

        link.remove("qq");

        link.travel();
    }
}

二叉树

class Tree {

    private class TreeNode {
        int value;
        TreeNode left;
        TreeNode right;
    }

    private TreeNode root; // 根引用

    public void add(int n) {
        TreeNode newNode = new TreeNode();
        newNode.value = n;
        if (root == null) { // 树为空
            root = newNode;
        } else {
            insert(root, newNode);
        }
    }

    public void insert(TreeNode target, TreeNode newNode) {
        if (newNode.value < target.value) { // 新结点比目标小, 向左走
            if (target.left == null) {
                target.left = newNode;
            } else {
                insert(target.left, newNode);
            }
        } else { // 向右走
            if (target.right == null) {
                target.right = newNode;
            } else {
                insert(target.right, newNode);
            }
        }
    }

    public void view(TreeNode node) {
        if (node == null) {
            return;
        }
        view(node.left);
        System.out.println(node.value);
        view(node.right);
    }

    public void travel() {
        view(root);
    }
}

public class TreeTest {

    public static void main(String[] args) {
        Tree tree = new Tree();
        tree.add(20);
        tree.add(10);
        tree.add(50);
        tree.add(80);
        tree.add(5);
        tree.add(2);
        tree.add(9);

        tree.travel();

    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * 基于链表实现树结构 */ package dsa; public class TreeLinkedList implements Tree { private Object element;//树根节点 private TreeLinkedList parent, firstChild, nextSibling;//父亲、长子及最大的弟弟 //(单节点树)构造方法 public TreeLinkedList() { this(null, null, null, null); } //构造方法 public TreeLinkedList(Object e, TreeLinkedList p, TreeLinkedList c, TreeLinkedList s) { element = e; parent = p; firstChild = c; nextSibling = s; } /*---------- Tree接口中各方法的实现 ----------*/ //返回当前节点中存放的对象 public Object getElem() { return element; } //将对象obj存入当前节点,并返回此前的内容 public Object setElem(Object obj) { Object bak = element; element = obj; return bak; } //返回当前节点的父节点;对于根节点,返回null public TreeLinkedList getParent() { return parent; } //返回当前节点的长子;若没有孩子,则返回null public TreeLinkedList getFirstChild() { return firstChild; } //返回当前节点的最大弟弟;若没有弟弟,则返回null public TreeLinkedList getNextSibling() { return nextSibling; } //返回当前节点后代元素的数目,即以当前节点为根的子树的规模 public int getSize() { int size = 1;//当前节点也是自己的后代 TreeLinkedList subtree = firstChild;//从长子开始 while (null != subtree) {//依次 size += subtree.getSize();//累加 subtree = subtree.getNextSibling();//所有孩子的后代数目 } return size;//即可得到当前节点的后代总数 } //返回当前节点的高度 public int getHeight() { int height = -1; TreeLinkedList subtree = firstChild;//从长子开始 while (null != subtree) {//依次 height = Math.max(height, subtree.getHeight());//在所有孩子中取最大高度 subtree = subtree.getNextSibling(); } return height+1;//即可得到当前节点的高度 } //返回当前节点的深度 public int getDepth() { int depth = 0; TreeLinkedList p = parent;//从父亲开始 while (null != p) {//依次 depth++; p = p.getParent();//访问各个真祖先 } return depth;//真祖先的数目,即为当前节点的深度 } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值