二叉樹操作(java)

來源:互聯網
上載者:User
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();}}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.