二叉树操作(java)

来源:互联网 发布:天刀捏脸数据男五毒 编辑:程序博客网 时间:2024/06/05 22:34
package mit.bintree;/**二叉树节点类*/public class Node<T>{    /*节点值*/    public T data;    /*左子节点引用*/    public Node<T> left   = null;    /*右子节点引用*/    public Node<T> right  = null;    /*父节点引用*/    public Node<T> parent =null;        Node(){            }        Node(T data){        this.data = data;    }        Node(T data, Node<T> parent, Node<T> left, Node<T> right){        this.data   = data;        this.parent = parent;        this.left   = left;        this.right  = right;    }        /*连接节点,主要是让其孩子节点指向父节点*/    public boolean joinNode(Node<T> b, boolean isLeft){        if (isLeft && this.left != null) {            return false;        }else if (!isLeft && this.right != null) {            return false;        }        if (isLeft) {            this.left = b;        }else{            this.right = b;        }        b.parent = this;        return true;    }        @Override    public String toString(){        return data.toString();    }        /*遍历当前节点及其子节点: 中序遍历*/    public static<T> void display(Node<T> node){        if (node != null) {            display(node.left);            System.out.print(node.data + "\t");            display(node.right);                    }    }    public static void main(String[] args){        Node<Integer> root = new Node<Integer>(0);        Node<Integer> lc1  = new Node<Integer>(1, root, null, null);        Node<Integer> lr1  = new Node<Integer>(2, root, null, null);        root.joinNode(lc1, true);        root.joinNode(lr1, false);                System.out.println(root);                System.out.println(lc1.parent);                System.out.println("show ....");        display(root);        System.out.println();    }}


package mit.bintree;import java.util.Comparator;/** * 二叉树。包括插入,删除,遍历 *  * @author:lee * @date:2013/6/13 */public class BinTree<T> {private Node<T> root;private Comparator<T> comp;BinTree(Comparator<T> comp) {root = new Node<T>();this.comp = comp;}BinTree(T data, Comparator<T> comp) {root = new Node<T>(data);this.comp = comp;}BinTree(T data, Node<T> left, Node<T> right, Comparator<T> comp) {root = new Node<T>(data, null, left, right);this.comp = comp;}/** 节点插入; */public boolean insert(Node<T> node) {if (node.data == null) {throw new IllegalArgumentException("");}if (root == null) {root = node;return true;}Node<T> pivot = root;Node<T> parent;while (true) {parent = pivot;if (comp.compare(pivot.data, node.data) >= 0) { pivot = pivot.left;if (pivot == null) {return parent.joinNode(node, true);}} else {pivot = pivot.right;if (pivot == null) {return parent.joinNode(node, false);}}}}public boolean insert(T data) {Node<T> node = new Node<T>(data);return insert(node);}/** 节点删除 */public boolean delete(Node<T> node) {if (root == null) {throw new IllegalArgumentException("树中没有数据");}if (node == null || node.data == null) {throw new IllegalArgumentException("删除节点不能为null");}Node<T> current = root;boolean isLeft = true;while (true) {if (comp.compare(current.data, node.data) > 0) {current = current.left;isLeft = true;if (current == null) {return false;// 没有节点了,返回false}} else if (comp.compare(current.data, node.data) < 0) {current = current.right;isLeft = false;if (current == null) {return false;}} else {/* 找到对应值时 */// 共三种情况Node<T> parent = current.parent;if (current.left == null && current.right == null) {if (parent == null) {// 当只有root节点时root = null;current = null;return true;}if (isLeft) {parent.left = null;current = null;} else {parent.right = null;current = null;}} else if (current.left == null && current.right != null) {if (isLeft) {parent.left = current.right;current.right.parent = parent;current = null;} else {parent.right = current.right;current.right.parent = parent;current = null;}} else if (current.left != null && current.right == null) {if (isLeft) {parent.left = current.left;current.left.parent = parent;current = null;} else {parent.right = current.left;current.right.parent = parent;current = null;}} else {/* 遍历左子树最大节点或者右子树最小节点justU来代替当前节点,然后删除justU */Node<T> cRight = current.right; // 右子树方案if (cRight.left != null) {while (cRight.left.left != null) { // 遍历左子树,找到最小节点justUcRight = cRight.left;}current.data = cRight.left.data; // 代替当前节点// 考虑CRight.left是否还有右子结点。if (cRight.left.right != null) {cRight.left = cRight.left.right;}cRight.left = null;} else { // 当前左子树只有一个节点时current.data = cRight.data;current.right = cRight.right;cRight = null;}}return true;}}}public boolean delete(T data) {Node<T> node = new Node<T>(data);return delete(node);}public void display() {Node.display(root);}public static void main(String[] args) {Comparator<Integer> comp = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {if (o1 > o2) {return 1;} else if (o1 < o2) {return -1;} else {return 0;}}};BinTree<Integer> btree = new BinTree<Integer>(10, comp);Node<Integer> n1 = new Node<Integer>(9);Node<Integer> n2 = new Node<Integer>(2);Node<Integer> n3 = new Node<Integer>(2);Node<Integer> n4 = new Node<Integer>(11);Node<Integer> n5 = new Node<Integer>(90);Node<Integer> n6 = new Node<Integer>(10);boolean res;btree.insert(n1);btree.insert(n2);btree.insert(n3);btree.insert(n4);btree.insert(n5);btree.insert(n6);btree.insert(32);btree.insert(100);btree.insert(-1);System.out.println(n6.parent.data);System.out.println();System.out.println("树:");btree.display();btree.insert(3);btree.insert(30);res = btree.delete(-100);System.out.println();System.out.println(res + "删除节点-100之后的树");btree.display();res = btree.delete(32);System.out.println();System.out.println(res + "删除节点32之后的树");btree.display();res = btree.delete(-1);System.out.println();System.out.println(res + "删除节点-1之后的树");btree.display();res = btree.delete(10);System.out.println();System.out.println(res + "删除节点10之后的树");btree.display();res = btree.delete(9);System.out.println();System.out.println(res + "删除节点9之后的树");btree.display();res = btree.delete(2);System.out.println();System.out.println(res + "删除节点2之后的树");btree.display();btree.insert(101);btree.insert(103);btree.insert(150);btree.insert(130);btree.insert(155);btree.insert(185);System.out.println();btree.display();res = btree.delete(103);System.out.println();System.out.println(res + "删除节点103之后的树");btree.display();System.out.println();res = btree.delete(101);System.out.println();System.out.println(res + "删除节点101之后的树");btree.display();System.out.println();res = btree.delete(150);System.out.println();System.out.println(res + "删除节点150之后的树");btree.display();System.out.println();res = btree.delete(155);System.out.println();System.out.println(res + "删除节点155之后的树");btree.display();System.out.println();btree.insert(12);System.out.println("插入12之后,树:");btree.display();System.out.println();res = btree.delete(12);        System.out.println();        System.out.println(res + "删除节点12之后的树");        btree.display();        System.out.println();                res = btree.delete(90);        System.out.println();        System.out.println(res + "删除节点90之后的树");        btree.display();        System.out.println();}}


原创粉丝点击