添加比较容易理解,删除在理解具体思路下用了一小时才完成 值的留念下
private static Node root;
public static void remove(Node n){
/**
* 1、找到对应节点的父节点p,并且判断当前节点是父节点p的左(l) 或 右(r)节点
* 2、根据当前节点是否有子节点分3种情况处理
* 3、如果左右节点都不为空,那真实删除的节点就是 左边最大 或者 右边最小 的节点,
* 然后使用实际删除的节点的值来替换当前节点即可
* 4、如果删除的节点是根节点(默认根节点为左节点)
*
*/
boolean isLeft = true;
Node p = null;
Node current = root;
do{
if(current.data == n.data)
break;
else if(current.data > n.data){
p = current;
current = current.left;
isLeft = true;
}else if(current.data < n.data){
p = current;
current = current.right;
isLeft = false;
}
}while(current != null);
if(current != null){
Node l = current.left;
Node r = current.right;
if(l == null && r == null){
if(isLeft)
p.left = null;
else
p.right = null;
}else if(l == null){
current.right = null;
if(isLeft)
p.left = r;
else
p.right = r;
}else if(r == null){
current.right = null;
if(isLeft)
p.left = l;
else
p.right = l;
}else{
Node needReplace = current;
if(isLeft){
current = current.right;
while(current.left != null)
current = current.left;
}else{
current = current.left;
while(current.right != null)
current = current.right;
}
remove(current);
needReplace.data = current.data;
}
}
}
public static void main(String[] args) {
int[] arr = {29,5,37,1,25,31,40,15,26,30,36,20,35,17,32,18,33,19,34};
for(int i : arr)
add(i);
levelTravel(root);
remove(new Node(370)); // 如果有兴趣可以多换几个数字测试下,25 ,31是比较复杂的删除
System.out.println();
levelTravel(root);
}
static class Node{
int data;
Node left;
Node right;
public Node(int data) {
this.data = data;
}
public String toString(){
return "[data=" + data + "]";
}
}
public static void add(int ele){
if(root == null)
root = new Node(ele);
else{
Node current = root,
p = null;
int d = 0;
do{
p = current;
d = ele - current.data;
if(d > 0)
current = current.right;
else if(d < 0)
current = current.left;
else
return ;
}while(current != null);
Node n = new Node(ele);
if(d > 0)
p.right = n;
else
p.left = n;
}
}
public static void levelTravel(Node root){
int h = 0, r = 0;
Node[] arr = new Node[100];
arr[r++] = root;
while(h<r){
Node n = arr[h++];
System.out.print(n.data+" ");
if(n.left != null)
arr[r++]=n.left;
if(n.right != null)
arr[r++]=n.right;
}
}