二叉树操作(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();}}