二叉树

二叉树

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

public class BinaryTree<E extends Comparable<E>> extends AbstractTree<E> {
    private TreeNode<E> root = null;
    private int size = 0;

    @Override
    public boolean search(E e) {
        // TODO Auto-generated method stub
        TreeNode<E> current = root;
        while(current != null) {
            if(e.compareTo(current.item) < 0) {
                current = current.left;
            }
            else if(e.compareTo(current.item) > 0) {
                current = current.right;
            }
            else {
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean delete(E e) {
        // TODO Auto-generated method stub
        TreeNode<E> current = root;
        while(current != null) {
            if(e.compareTo(current.item) < 0) {
                current = current.left;
            }
            else if(e.compareTo(current.item) > 0) {
                current = current.right;
            }
            else {
                break;
            }
        }
        if(current == null) {
            return false;
        }
        if(current.left == null) {
            if(current.parent == null) {
                root = current.right;
                current.right.parent = null;
            }
            else {
                if(e.compareTo(current.parent.item) < 0) {
                    current.parent.left = current.right;
                    if(current.right != null) {  //必须要这个判断,否则java.lang.NullPointerException
                        current.right.parent = current.parent.left;
                    }
                    //help GC
                    current.parent = null;
                    current.right = null;
                    current = null;
                }
                else {
                    current.parent.right = current.right;
                    if(current.right != null) {  //必须要这个判断,否则java.lang.NullPointerException
                        current.right.parent = current.parent.right;
                    }
                    //help GC
                    current.parent = null;
                    current.right = null;
                    current = null;
                }
            }
        }
        else {
            TreeNode<E> rm = current.left;
            while(rm.right != null) {
                rm = rm.right;
            }
            current.item = rm.item;
            if(rm.parent.right == rm) {
                rm.parent.right = rm.left;
                if(rm.left != null) {  //必须要这个判断,否则java.lang.NullPointerException
                    rm.left.parent = rm.parent;
                }
                //help GC
                rm.item = null;
                rm.left = null;
                rm = null;
            }
            else {
                current.left = rm.left;
                if(rm.left != null) {  //必须要这个判断,否则java.lang.NullPointerException
                    rm.left.parent = current;
                }
                //help GC
                rm.item = null;
                rm.left = null;
                rm = null;
            }
        }
        size--;
        return true;
    }

    @Override
    public boolean insert(E e) {
        // TODO Auto-generated method stub
        if(root == null) {
            root = new TreeNode<E>(e);
            size++;
        }
        else {
            TreeNode<E> parent = null;
            TreeNode<E> current = root;
            while(current != null) {
                if(e.compareTo(current.item) < 0) {
                    parent = current;
                    current = current.left;
                }
                else if(e.compareTo(current.item) > 0) {
                    parent = current;
                    current = current.right;
                }
                else {
                    return false;
                }
            }
            if(e.compareTo(parent.item) < 0) {
                parent.left = new TreeNode<E>(e);
                parent.left.parent = parent;
            }
            else {
                parent.right = new TreeNode<E>(e);
                parent.right.parent = parent;
            }
            size++;
        }
        return true;
    }

    @Override
    public void inorder() {
        // TODO Auto-generated method stub
        inorder(root);
    }
    private void inorder(TreeNode<E> root) {
        if(root == null) {
            return ;
        }
        inorder(root.left);
        System.out.print(root.item + " ");
        inorder(root.right);
    }

    @Override
    public void nrinorder() {
        // TODO Auto-generated method stub
        Stack<TreeNode<E>> stack = new Stack<>();
        TreeNode<E> c = root;
        while(!stack.isEmpty() || c!=null) {
            while(c != null) {
                stack.push(c);
                c = c.left;
            }
            c = stack.pop();
            System.out.print(c.item + " ");
            c = c.right;
        }
    }

    @Override
    public void preorder() {
        // TODO Auto-generated method stub
        preorder(root);
    }
    private void preorder(TreeNode<E> root) {
        // TODO Auto-generated method stub
        if(root == null) {
            return;
        }
        System.out.print(root.item + " ");
        preorder(root.left);
        preorder(root.right);
    }

    @Override
    public void nrpreorder() {
        // TODO Auto-generated method stub
        TreeNode<E> current = root;
        Stack<TreeNode<E>> stack = new Stack<>();
        while(!stack.isEmpty() || current!=null) {
            if(current == null) {
                current = stack.pop();
            }
            System.out.print(current.item + " ");
            if(current.right != null) {
                stack.push(current.right);
            }
            current = current.left;
        }
    }

    @Override
    public void postorder() {
        // TODO Auto-generated method stub
        postorder(root);
    }
    private void postorder(TreeNode<E> root) {
        if(root == null) {
            return;
        }
        postorder(root.left);
        postorder(root.right);
        System.out.print(root.item + " ");
    }

    @Override
    public void nrpostorder() {
        // TODO Auto-generated method stub
        TreeNode<E> last = null;
        TreeNode<E> current = root;
        Stack<TreeNode<E>> stack = new Stack<>();
        while(!stack.isEmpty() || current!=null) {
            while(current != null) {
                stack.push(current);
                current = current.left;
            }
            current = stack.peek();
            if(current.right==null || current.right==last) {
                System.out.print(current.item + " ");
                last = stack.pop();
                current = null;
            }
            else {
                current = current.right;
            }
        }
    }

    @Override
    public void breadthorder() {
        // TODO Auto-generated method stub
        LinkedList<TreeNode<E>> list = new LinkedList<>();
        TreeNode<E> current = root;
        list.add(current);
        int index = 0;
        while(index < getSize()) {
            for(int i=0;i<list.size();i++) {
                if(list.get(i) != null) {
                    TreeNode<E> temp = list.get(i);
                    System.out.print(temp.item + " ");
                    list.add(i, temp.left);
                    list.add(i+1,temp.right);
                    list.remove(temp);
                    index++;
                    i++;
                }
            }
        }
    }

    @Override
    public int getSize() {
        // TODO Auto-generated method stub
        return size;
    }


    @Override
    public void clear() {
        // TODO Auto-generated method stub
        clearPreorder(root);
        size = 0;
    }
    private void clearPreorder(TreeNode<E> root) {
        root.parent = null;
        root.item = null;
        clearPreorder(root.left);
        clearPreorder(root.right);
    }

    //获得指定元素的路径,如果二叉树中不存在此元素,则返回null
    public ArrayList<TreeNode<E>> path(E e) {
        if(!search(e)) {
            return null;
        }
        ArrayList<TreeNode<E>> list = new ArrayList<>();
        TreeNode<E> current = root;
        while(current != null) {
            list.add(current);
            if(e.compareTo(current.item) < 0) {
                current = current.left;
            }
            else if(e.compareTo(current.item) > 0) {
                current = current.right;
            }
            else {
                break;
            }
        }
        return list;
    }

    //返回二叉树的高度
    public int height() {
        int len = 0;
        ArrayList<TreeNode<E>> list = new ArrayList<>();
        TreeNode<E> current = root;
        list.add(current);
        int index = 0;
        while(index < getSize()) {
            for(int i=0;i<list.size();i++) {
                if(list.get(i) != null) {
                    TreeNode<E> temp = list.get(i);
                    list.add(i, temp.left);
                    list.add(i+1, temp.right);
                    list.remove(temp);
                    index++;
                    i++;
                }
            }
            len++;
        }
        return len;
    }

    //如果此二叉树为完全二叉树,则返回true
    public boolean isFullBinaryTree() {
        ArrayList<TreeNode<E>> list = new ArrayList<>();
        TreeNode<E> current = root;
        list.add(current);
        int index = 0;
        while(index < getSize()) {
            for(int i=0;i<list.size();i++) {
                if(list.get(i) != null) {
                    TreeNode<E> temp = list.get(i);
                    list.add(i,temp.left);
                    list.add(i+1,temp.right);
                    list.remove(temp);
                    index++;
                    i++;
                }
                else {
                    return false;
                }
            }
        }
        return true;
    }

    //返回根节点
    public TreeNode<E> getRoot() {
        return root;
    }

    //返回指定元素的父节点
    public TreeNode<E> getParent(E e) {
        TreeNode<E> current = root;
        while(current != null) {
            if(e.compareTo(current.item) < 0) {
                current = current.left;
            }
            else if(e.compareTo(current.item) > 0) {
                current = current.right;
            }
            else {
                return current.parent;
            }
        }
        return null;
    }

    //返回叶子节点的个数
    public int getNumberOfLeaves() {
        return getNumberOfLeaves(root);
    }
    private int getNumberOfLeaves(TreeNode<E> root) {
        if(root == null) {
            return 0;
        }
        else if(root.right==null && root.left==null) {
            return 1;
        }
        else {
            return getNumberOfLeaves(root.left) + getNumberOfLeaves(root.right);
        }
    }

    //返回非叶子节点的个数
    public int getNumberOfNonLeaves() {
        return getSize()-getNumberOfLeaves();
    }

    static class TreeNode<E extends Comparable<E>> {
        protected E item;
        protected TreeNode<E> parent;
        protected TreeNode<E> left;
        protected TreeNode<E> right;

        public TreeNode(E item) {
            this.item = item;
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值