java树的构造
public class BinearySearchTree<T extends Comparable<T>> {
private class Node<T> {
private T ele;
private Node left, right;
private int frequence;
public Node(T e) {
this.ele = e;
this.frequence = 1;
this.left = this.right = null;
}
}
private Node<T> root;
private int size;
public BinearySearchTree() {
this.root = null;
this.size = 0;
}
public int getSize() {
return this.size;
}
public void add(T e) {
this.root = addDG(root, e);
}
private Node addDG(Node<T> root, T e) {
if (root == null) {
this.size++;
return new Node(e);
}
if (root.ele.compareTo(e) > 0) {
root.left = addDG(root.left, e);
} else if (root.ele.compareTo(e) < 0) {
root.right = addDG(root.right, e);
} else {
root.frequence++;
}
return root;
}
public boolean search(T e) {
return searchDG(this.root, e);
}
private boolean searchDG(Node<T> root, T e) {
if (root == null) {
return false;
}
if (root.ele.compareTo(e) == 0) {
return true;
} else if (root.ele.compareTo(e) > 0) {
return searchDG(root.left, e);
} else {
return searchDG(root.right, e);
}
}
public void preTravel() {
List<AbstractMap.SimpleEntry<T, Integer>> list = new ArrayList<>();
preTravelDG(this.root, list);
System.out.println(list.stream().map(item -> "[" + item.getKey() + ": " + item.getValue() + "]").collect(Collectors.joining()));
}
private void preTravelDG(Node<T> root, List<AbstractMap.SimpleEntry<T, Integer>> list) {
if (root == null) {
return;
}
list.add(new AbstractMap.SimpleEntry<>(root.ele, root.frequence));
preTravelDG(root.left, list);
preTravelDG(root.right, list);
}
public void midTravel() {
List<AbstractMap.SimpleEntry<T, Integer>> list = new ArrayList<>();
midTravelDG(this.root, list);
System.out.println(list.stream().map(item -> "[" + item.getKey() + ": " + item.getValue() + "]").collect(Collectors.joining()));
}
private void midTravelDG(Node<T> root, List<AbstractMap.SimpleEntry<T, Integer>> list) {
if (root == null) {
return;
}
midTravelDG(root.left, list);
list.add(new AbstractMap.SimpleEntry<>(root.ele, root.frequence));
midTravelDG(root.right, list);
}
public void suffixTravel() {
List<AbstractMap.SimpleEntry<T, Integer>> list = new ArrayList<>();
suffixTravelDG(this.root, list);
System.out.println(list.stream().map(item -> "[" + item.getKey() + ": " + item.getValue() + "]").collect(Collectors.joining()));
}
private void suffixTravelDG(Node<T> root, List<AbstractMap.SimpleEntry<T, Integer>> list) {
if (root == null) {
return;
}
suffixTravelDG(root.left, list);
suffixTravelDG(root.right, list);
list.add(new AbstractMap.SimpleEntry<>(root.ele, root.frequence));
}
public boolean IsEmpty() {
return this.size == 0;
}
public void levelTravel() {
if (IsEmpty()) {
return;
}
Queue<AbstractMap.SimpleEntry<Node<T>, Integer>> queue = new LinkedList<>();
queue.add(new AbstractMap.SimpleEntry<>(this.root, 1));
while (!queue.isEmpty()) {
AbstractMap.SimpleEntry<Node<T>, Integer> pair = queue.poll();
Node node = pair.getKey();
int level = pair.getValue();
System.out.println("[value:" + node.ele + ",level:" + level + "] ");
if (node.left != null) {
queue.add(new AbstractMap.SimpleEntry<>(node.left, level + 1));
}
if (node.right != null) {
queue.add(new AbstractMap.SimpleEntry<>(node.right, level + 1));
}
}
}
public T getMinValue() {
Optional<Node<T>> optional = getMinNode();
if (optional.isPresent()) {
return optional.get().ele;
}
return null;
}
private Optional<Node<T>> getMinNode() {
if (this.root == null) {
return Optional.empty();
}
Node<T> node = this.root;
while (node.left != null) {
node = node.left;
}
return Optional.of(node);
}
public Node<T> getMinNode(Node<T> root){
if (root == null) {
return null;
}
Node<T> node = root;
while (node.left != null) {
node = node.left;
}
return node;
}
public T DGgetMinValue() {
Optional<Node<T>> optional = DGgetMinNode(this.root);
if (optional.isPresent()) {
return optional.get().ele;
}
return null;
}
private Optional<Node<T>> DGgetMinNode(Node<T> node) {
if (node.left == null) {
return Optional.of(node);
}
return DGgetMinNode(node.left);
}
public T getMaxValue() {
Optional<Node<T>> optional = getMaxNode();
if (optional.isPresent()) {
return optional.get().ele;
}
return null;
}
private Optional<Node<T>> getMaxNode() {
if (this.root == null) {
return Optional.empty();
}
Node<T> node = this.root;
while (node.right != null) {
node = node.right;
}
return Optional.of(node);
}
public T DGgetMaxValue() {
Optional<Node<T>> optional = DGgetMaxNode(this.root);
if (optional.isPresent()) {
return optional.get().ele;
}
return null;
}
private Optional<Node<T>> DGgetMaxNode(Node<T> node) {
if (node.right == null) {
return Optional.of(node);
}
return DGgetMaxNode(node.right);
}
public T removeMinNode() {
if (this.IsEmpty()) {
return null;
}
T result = getMinValue();
this.root = DGremoveMinNode(this.root);
return result;
}
private Node<T> DGremoveMinNode(Node<T> node) {
if (node.left == null) {
Node<T> rightTree = node.right;
node.right = null;
this.size--;
return rightTree;
}
node.left = DGremoveMinNode(node.left);
return node;
}
public T removeMaxNode() {
if (this.IsEmpty()) {
return null;
}
T result = getMaxValue();
this.root = DGremoveMaxNode(this.root);
return result;
}
private Node DGremoveMaxNode(Node<T> node) {
if (node.right == null) {
Node<T> leftTree = node.left;
node.left = null;
this.size--;
return leftTree;
}
node.right = DGremoveMaxNode(node.right);
return node;
}
public void remove(T ele) {
this.root = DGremove(this.root, ele);
}
private Node<T> DGremove(Node<T> node, T ele) {
if (node == null) {
return null;
}
if (node.ele.compareTo(ele) == 0) {
this.size--;
if(node.left==null){
Node<T> rightNode=node.right;
node.right=null;
return rightNode;
}else if(node.right==null){
Node<T> leftNode=node.left;
node.left=null;
return leftNode;
}
else{
Node<T> suffixNode = getMinNode(node.right);
suffixNode.right = DGremoveMinNode(node.right);
suffixNode.left = node.left;
node.left=node.right=null;
this.size++;
return suffixNode;
}
}
else if (node.ele.compareTo(ele) > 0) {
node.left = DGremove(node.left, ele);
} else {
node.right = DGremove(node.right, ele);
}
return node;
}
public void removeRoot(){
if(this.root==null){
return;
}
remove(this.root.ele);
}
}