最后
由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!
小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》
- @return
*/
public boolean add(E e) {
if(e == null) return false;
if(root == null ) {
root = new TreeNode(e, null);
return true;
}
add0(root, e);
return true;
}
/**
-
10
-
/ \
-
3 18
-
/ \ / \
-
2 4 13 21
-
\
-
9
-
/ \
-
8 9
-
@param root
-
@param e
*/
private TreeNode add0(TreeNode root, E e) {
final TreeNode curNode = root;
int cmp = compare(e, curNode.value);
if(cmp < 0 ) { //表示待插入的节点值,比当前节点值小
if(curNode.left == null) {
//创建当前节点的左节点
TreeNode newNode = new TreeNode(e, curNode);
curNode.left = newNode;
return newNode;
} else {
return add0(curNode.left, e);//遍历左子树
}
} else { // 大于等于0,右子树
if(curNode.right == null ) {
//创建当前节点的右节点
TreeNode newNode = new TreeNode(e, curNode);
curNode.right = newNode;
return newNode;
} else {
return add0(curNode.right, e);//遍历右子树
}
}
}
/**
-
比较两个元素的大小
-
@param e1
-
@param e2
-
@return
*/
@SuppressWarnings(“unchecked”)
private int compare(E e1, E e2) {
return comparator == null ? ((Comparable) e1 ).compareTo(e2) : comparator.compare(e1, e2);
}
/**
-
删除元素
-
@param e
-
@return 如果返回ture,表示删除成功,如果返回false,表示删除失败,没有找到元素
*/
public boolean remove(E e) {
if( e == null ) return false;
TreeNode cur = root;
int cmp;
while (cur != null ) {
if(e.equals(cur.value)) {
break;
}
cmp = compare(e, root.value);
if(cmp < 0 ) { //表示待删除的节点值,比当前节点值小
cur = cur.left;
} else {
cur = cur.right;
}
}
if(cur != null ) { //找到了元素,需要删除该元素
TreeNode cLeft = cur.left;
TreeNode cRight = cur.right;
if(cLeft != null ) { //如果被删除节点的左子树不为空,则将左子树放入当前节点的位置
remove0(cLeft, cur);
if(cLeft.right != null && cur.right != null) { //需要移动相应节点
TreeNode wNode = cLeft.right;
cLeft.right = cur.right;
wNode.parent = null;
TreeNode newNode = add0(cLeft, wNode.value);
newNode.left = wNode.left;
newNode.right = wNode.right;
wNode = null;
}
} else {
remove0(cRight, cur);
}
//将当前节点释放,,help GC
cur.value = null;
cur.right = null;
cur.left = null;
cur.parent = null;
cur = null;
return true;
}
return false;
}
private void remove0(TreeNode newNode, TreeNode cur) {
TreeNode parent = cur.parent;
newNode.parent = parent;
if(cur.parent.left == cur) {
cur.parent.left = newNode;
} else {
cur.parent.right = newNode;
}
}
/**
- 中序遍历
*/
public void middleOrderTraversal() {
System.out.println(“----------中序遍历开始---------\n”);
if (root == null) {
System.out.print(“二叉树”);
System.out.println(“----------中序遍历结束---------\n”);
return;
}
middleOrderTraversal0(root);
System.out.println(“\n----------中序遍历结束---------\n”);
}
/**
- 中序遍历
*/
private void middleOrderTraversal0(TreeNode root) {
if (root == null)
return;
final TreeNode cur = root;
if (cur.left != null) {
middleOrderTraversal0(cur.left);
System.out.print(toObjectString(cur.value) + “,”);
middleOrderTraversal0(cur.right);
} else if (cur.right != null) {
System.out.print(cur.value + “,”);
middleOrderTraversal0(cur.right);
} else {
// 此时输出节点
System.out.print(cur.value + “,”);
}
}
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
private String toObjectString(E value) {
return value == null ? “” : value.toString();
}
/**
-
二叉数
-
@author Administrator
-
@param
*/
@SuppressWarnings(“unused”)
private final static class TreeNode implements Serializable {
private static final long serialVersionUID = 6540618639489225256L;
public E value;
public TreeNode left;
public TreeNode right;
public TreeNode parent;
public TreeNode(E value, TreeNode parent) {
super();
this.value = value;
this.parent = parent;
}
public TreeNode(E value, TreeNode left, TreeNode right, TreeNode parent) {
super();
this.value = value;
this.left = left;
this.right = right;
this.parent = parent;
}
@Override
public String toString() {
if(value != null)
return value.toString();
return super.toString();
}
}
/** *******************测试 start ***************************/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(“测试开始”);
// BinaryTree t = new BinaryTree();
// t.setRoot(t.initTree());
// t.middleOrderTraversal();
//先研究一下 Comparator o1 > o2 的排序逻辑
//testSort();
/* * 10
-
/ \
-
3 18
-
/ \ / \
-
2 4 13 21
-
\ / \
-
9 11 15
-
/ \
-
8 9
*/
// add 方法测试
BinaryTree t = new BinaryTree();
// t.add(new Integer(10));
// t.add(new Integer(18));
// t.add(new Integer(3));
// t.add(new Integer(2));
// t.add(new Integer(4));
// t.add(new Integer(8));
// t.add(new Integer(9));
// t.add(new Integer(9));
// t.add(new Integer(21));
// t.add(new Integer(13));
写在最后
为了这次面试,也收集了很多的面试题!
以下是部分面试题截图
er(3));
// t.add(new Integer(2));
// t.add(new Integer(4));
// t.add(new Integer(8));
// t.add(new Integer(9));
// t.add(new Integer(9));
// t.add(new Integer(21));
// t.add(new Integer(13));
写在最后
为了这次面试,也收集了很多的面试题!
以下是部分面试题截图
[外链图片转存中…(img-EKmr8sKJ-1715673552161)]