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();}}