Skip to content

Commit

Permalink
JVM第九次作业
Browse files Browse the repository at this point in the history
  • Loading branch information
dengweigong committed May 26, 2017
1 parent f2d1c8d commit b6239f4
Show file tree
Hide file tree
Showing 3 changed files with 282 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class OutOfMemory_PermGen_space {

Expand All @@ -12,8 +11,8 @@ public static void main(String[] args) {
int i = 1;
try {
while (true) {
list.add(UUID.randomUUID().toString().intern());
i++;
list.add(String.valueOf(i++).intern());
System.out.println("i: "+i);
}
} finally {
System.out.println("运行次数:" + i);
Expand Down
190 changes: 151 additions & 39 deletions group21/315752375/src/com/coding/basic/tree/BinarySearchTree.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package com.coding.basic.tree;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import com.coding.basic.queue.Queue;
import com.sun.org.apache.bcel.internal.generic.RETURN;

public class BinarySearchTree<T extends Comparable> {

BinaryTreeNode<T> root;
Expand Down Expand Up @@ -45,52 +52,157 @@ public void remove(T e) {
BinaryTreeNode<T> preNode = findPreNode(e);
if (preNode == null)
return;
if (preNode.left == root)
root = null;
else {
BinaryTreeNode<T> curNode = null;
boolean isLeftChild = true;
if (preNode.left.data.equals(e))
curNode = preNode.left;
try {
if (preNode.left == root)
root = null;
else {
curNode = preNode.right;
isLeftChild = false;
}
if (curNode.left == null && curNode.right == null) {
if (isLeftChild)
preNode.left = null;
else
preNode.right = null;
return;
} else if (curNode.left == null || curNode.right == null) {
if (curNode.left != null) {
BinaryTreeNode<T> curNode = null;
boolean isLeftChild = true;
if (preNode.left.data.equals(e))
curNode = preNode.left;
else {
curNode = preNode.right;
isLeftChild = false;
}
if (curNode.left == null && curNode.right == null) {
if (isLeftChild)
preNode.left = curNode.left;
preNode.left = null;
else
preNode.right = curNode.left;
preNode.right = null;
return;
} else if (curNode.left == null || curNode.right == null) {
if (curNode.left != null) {
if (isLeftChild)
preNode.left = curNode.left;
else
preNode.right = curNode.left;
} else {
if (isLeftChild)
preNode.left = curNode.right;
else
preNode.right = curNode.right;
}
return;
} else {
if (isLeftChild)
preNode.left = curNode.right;
else
preNode.right = curNode.right;
}
return;
}else{
curNode=curNode.right;
while (curNode.left!=null) {
curNode=curNode.left;
curNode = curNode.right;
while (curNode.left != null) {
curNode = curNode.left;
}
remove(curNode.data);
if (isLeftChild) {
preNode.left.data = curNode.data;
} else
preNode.right.data = curNode.data;

}
remove(curNode.data);
if (isLeftChild) {
preNode.left.data=curNode.data;
}else preNode.right.data=curNode.data;

}
} finally {
trverse(root);
}

}

public int trverse(BinaryTreeNode<T> root) {
public List<T> levelVisit() {
Queue<BinaryTreeNode<T>> queue = new Queue<>();
List<T> ans = new LinkedList<>();
queue.enQueue(root);
BinaryTreeNode<T> curNode = null;
while (!queue.isEmpty()) {
curNode = queue.deQueue();
ans.add(curNode.data);
if (curNode.left != null)
queue.enQueue(curNode.left);
if (curNode.right != null)
queue.enQueue(curNode.right);
}
return ans;
}

public boolean isValid() {
return isValid(root);
}

private boolean isValid(BinaryTreeNode<T> root) {
if (root == null)
return true;
boolean isSubValid = false;
if (root.left != null) {
BinarySearchTree<T> leftSubTree = new BinarySearchTree<>(root.left);
if (root.data.compareTo(leftSubTree.findMax()) < 0)
return false;
isSubValid = isValid(root.left);
if (!isSubValid)
return false;
}
if (root.right != null) {
BinarySearchTree<T> rightSubTree = new BinarySearchTree<>(
root.right);
T min = rightSubTree.findMin();
if (root.data.compareTo(rightSubTree.findMin()) > 0)
return false;
isSubValid = isValid(root.right);
if (!isSubValid)
return false;
}
return true;
}

public T getLowestCommonAncestor(T n1, T n2) {
List<T> n1Trace = findTrace(n1);
List<T> n2Trace = findTrace(n2);
T ans = null;
Iterator<T> n1Iter = n1Trace.iterator();
Iterator<T> n2Iter = n2Trace.iterator();
while (n1Iter.hasNext() && n2Iter.hasNext()) {
T cur1 = n1Iter.next();
T cur2 = n2Iter.next();
if (!cur1.equals(cur2))
return ans;
ans = cur1;
}
return ans;

}

private List<T> findTrace(T t) {
List<T> ans = new LinkedList<>();
BinaryTreeNode<T> cur = root;
while (!cur.data.equals(t)) {
ans.add(cur.data);
if (t.compareTo(cur.data) > 0)
cur = cur.right;
else
cur = cur.left;
}
ans.add(t);
return ans;
}

private List<T> listBetweenL = null;

public List<T> getNodesBetween(T n1, T n2) {
listBetweenL = new LinkedList<>();
if(n1.compareTo(n2)>0){
T tmp=n1;
n1=n2;
n2=tmp;
}
preOrder(root, n1, n2);
return listBetweenL;
}

private void preOrder(BinaryTreeNode<T> root, T min, T max) {
if (root == null)
return;
if (root.data.compareTo(min) > 0 && root.data.compareTo(max) < 0)
listBetweenL.add(root.data);
if (root.left != null)
preOrder(root.left, min, max);
if (root.right != null)
preOrder(root.right, min, max);
}

private int trverse(BinaryTreeNode<T> root) {
int left = 0;
int right = 0;
if (root == null) {
Expand All @@ -108,7 +220,7 @@ public int trverse(BinaryTreeNode<T> root) {
return height;
}

public BinaryTreeNode<T> findPreNode(T e) {
private BinaryTreeNode<T> findPreNode(T e) {
if (root == null)
return null;
BinaryTreeNode<T> pre = null;
Expand All @@ -117,7 +229,7 @@ public BinaryTreeNode<T> findPreNode(T e) {
pre.left = root;
return pre;
}
pre=root;
pre = root;
while (pre != null) {
if (pre.data.compareTo(e) > 0) {
if (pre.left == null)
Expand All @@ -131,7 +243,7 @@ public BinaryTreeNode<T> findPreNode(T e) {
return null;
if (pre.right.data.equals(e))
return pre;
pre =pre.right;
pre = pre.right;
continue;
}
}
Expand Down
Loading

0 comments on commit b6239f4

Please sign in to comment.