static class Node<E>{
E value;
Node<E> left;//왼쪽자식
Node<E> right;//오른쪽 자식
Node<E> parent;
Node(E value) {
this(value, null);
}
Node(E value, Node<E> parent) {
this.value = value;
this.parent = parent;
this.right = null;
this.left = null;
}
}
추가한Node insert(root, 찾을 data)
1) root == null
1)에서는 새로운 노드를 루트에 넣고 바로 반환하는데 2),3)은 재귀가 끝나고 나서..
root에 대한 node를 반환하면 됨.
즉, 이 insert는 root에 대해 data를 추가했을때의 root를 반환하는 함수인거임
어떠한 데이터를 삭제하고싶다
1) root==null 일경우
4-3) 내가 삭제하려는 애가 자식노드가 다 있다
findmin
static class BinarySearchTree{
Node root;
static class Node {
int value;
Node leftChild;
Node rightChild;
public Node(int value) {
this.value = value;
this.leftChild = null;
this.rightChild = null;
}
}
public Node insert(Node root, int value){
if(root==null){
root = new Node(value);
return root;
}
if(value < root.value){
root.leftChild = insert(root.leftChild, value);
}
if(value >= root.value){
root.rightChild = insert(root.rightChild, value);
}
return root;
}
public Node delete(Node root, int value){
if(root==null) return root;
if(root.value < value){
root.rightChild = delete(root.rightChild, value);
}
if(root.value > value){
root.leftChild = delete(root.leftChild, value);
}
if(root.value == value){
if(root.leftChild==null && root.rightChild==null) return null;
if(root.leftChild==null) return root.rightChild;
if(root.rightChild== null) return root.leftChild;
//둘다 존재할 경우
int min = getMin(root.rightChild);
root.value = min;
root.rightChild = delete(root.rightChild, min);
}
return root;
}
public int getMin(Node root){
int min = root.value;
while(root.leftChild!=null){
root = root.leftChild;
min = root.value;
}
return min;
}
}
1) inorder 4-2-5-1-3
1. left
2. root(자기자신)
3. right
2) preorder 1-2-4-5-3
1. root
2. left
3. right
3) postorder 4-5-2-3-1
1. left
2. right
3. root
public void inOrder(Node root){
if(root != null){
inOrder(root.leftChild);
System.out.println(root.value);
inOrder(root.rightChild);
}
}
public void preOrder(Node root){
if(root != null){
System.out.println(root.value);
preOrder(root.leftChild);
preOrder(root.rightChild);
}
}
public void postOrder(Node root){
if(root!=null){
postOrder(root.leftChild);
postOrder(root.rightChild);
System.out.println(root.value);
}
}
출처
https://zeddios.tistory.com/492 << 그림보면서 설명