Java实现二叉树及各种操作

来源:互联网 发布:刘诗诗同款衣服淘宝 编辑:程序博客网 时间:2024/05/13 17:54
public class BinTree {    public final static int MAX = 40;    private Object data; //数据元数    private BinTree left, right; //指向左,右孩子结点的链    BinTree[] elements = new BinTree[MAX];//层次遍历时保存各个节点    int front;//层次遍历时队首    int rear;//层次遍历时队尾    public BinTree() {    }    public BinTree(Object data) { //构造有值结点        this.data = data;        left = right = null;    }    public BinTree(Object data, BinTree left, BinTree right) { //构造有值结点        this.data = data;        this.left = left;        this.right = right;    }    public String toString() {        return data.toString();    }    //前序遍历二叉树    public static void preOrder(BinTree parent) {        if (parent == null)            return;        System.out.print(parent.data + " ");        preOrder(parent.left);        preOrder(parent.right);    }    //中序遍历二叉树    public void inOrder(BinTree parent) {        if (parent == null)            return;        inOrder(parent.left);        System.out.print(parent.data + " ");        inOrder(parent.right);    }    //后序遍历二叉树    public void postOrder(BinTree parent) {        if (parent == null)            return;        postOrder(parent.left);        postOrder(parent.right);        System.out.print(parent.data + " ");    }    // 层次遍历二叉树    public void LayerOrder(BinTree parent) {        elements[0] = parent;        front = 0;        rear = 1;        while (front < rear) {            try {                if (elements[front].data != null) {                    System.out.print(elements[front].data + " ");                    if (elements[front].left != null)                        elements[rear++] = elements[front].left;                    if (elements[front].right != null)                        elements[rear++] = elements[front].right;                    front++;                }            } catch (Exception e) {                break;            }        }    }    //返回树的叶节点个数    public int leaves() {        if (this == null)            return 0;        if (left == null && right == null)            return 1;        return (left == null ? 0 : left.leaves())                + (right == null ? 0 : right.leaves());    }    //结果返回树的高度    public int height() {        int heightOfTree;        if (this == null)            return -1;        int leftHeight = (left == null ? 0 : left.height());        int rightHeight = (right == null ? 0 : right.height());        heightOfTree = leftHeight < rightHeight ? rightHeight : leftHeight;        return 1 + heightOfTree;    }    //如果对象不在树中,结果返回-1;否则结果返回该对象在树中所处的层次,规定根节点为第一层    public int level(Object object) {        int levelInTree;        if (this == null)            return -1;        if (object == data)            return 1;//规定根节点为第一层        int leftLevel = (left == null ? -1 : left.level(object));        int rightLevel = (right == null ? -1 : right.level(object));        if (leftLevel < 0 && rightLevel < 0)            return -1;        levelInTree = leftLevel < rightLevel ? rightLevel : leftLevel;        return 1 + levelInTree;    }    //将树中的每个节点的孩子对换位置    public void reflect() {        if (this == null)            return;        if (left != null)            left.reflect();        if (right != null)            right.reflect();        BinTree temp = left;        left = right;        right = temp;    }    // 将树中的所有节点移走,并输出移走的节点    public void defoliate() {        String innerNode = "";        if (this == null)            return;        //若本节点是叶节点,则将其移走        if (left == null && right == null) {            System.out.print(this + " ");            data = null;            return;        }        //移走左子树若其存在        if (left != null) {            left.defoliate();            left = null;        }        //移走本节点,放在中间表示中跟移走...        innerNode += this + " ";        data = null;        //移走右子树若其存在        if (right != null) {            right.defoliate();            right = null;        }    }    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        BinTree e = new BinTree("E");        BinTree g = new BinTree("G");        BinTree h = new BinTree("H");        BinTree i = new BinTree("I");        BinTree d = new BinTree("D", null, g);//(Object data, BinTree left, BinTree right)        BinTree f = new BinTree("F", h, i);        BinTree b = new BinTree("B", d, e);        BinTree c = new BinTree("C", f, null);        BinTree tree = new BinTree("A", b, c);        tree.height();        System.out.println("前序遍历二叉树结果: ");        tree.preOrder(tree);        System.out.println();        System.out.println("中序遍历二叉树结果: ");        tree.inOrder(tree);        System.out.println();        System.out.println("后序遍历二叉树结果: ");        tree.postOrder(tree);        System.out.println();        System.out.println("层次遍历二叉树结果: ");        tree.LayerOrder(tree);        System.out.println();        System.out.println("F所在的层次: " + tree.level("F"));        System.out.println("这棵二叉树的高度: " + tree.height());        System.out.println("--------------------------------------");        tree.reflect();        System.out.println("交换每个节点的孩子节点后......");        System.out.println("前序遍历二叉树结果: ");        tree.preOrder(tree);        System.out.println();        System.out.println("中序遍历二叉树结果: ");        tree.inOrder(tree);        System.out.println();        System.out.println("后序遍历二叉树结果: ");        tree.postOrder(tree);        System.out.println();        System.out.println("层次遍历二叉树结果: ");        tree.LayerOrder(tree);        System.out.println();        System.out.println("F所在的层次: " + tree.level("F"));        System.out.println("这棵二叉树的高度: " + tree.height());    }}




0 0
原创粉丝点击