노드를 삭제하는 세 시나리오 수있다 ..
- 노드가 리프 노드 인이 여부 이것은 간단한 경우도 노드는 부모의 왼쪽 또는 오른쪽 노드이며 해당면의 부모에 대해 자식으로 null을 설정합니다.
- 노드에 자식이 하나 있습니다.이 노드의 부모 노드와 자식 노드 사이에 직접 연결을 설정하십시오.
- 노드에는 두 명의 자식이 있습니다. 이것은 약간 까다 롭습니다.이 단계는 관련된 것입니다.
- 먼저이 노드의 후속 노드 (또는 전임자)를 찾습니다.
- 트리에서 후속 (또는 전임자)을 삭제하십시오.노드를 교체
- , 우리는 후속의 개념 및 전임자
후계자를 이해해야합니다
삭제의 개념을 알고 전에 후계자 (또는 이전)을 삭제할 : 바이너리에서 노드의 트리 후속 노드는이 노드보다 엄격하게 큰 트리의 가장 작은 노드입니다. 오른쪽 서브 트리의 가장 왼쪽에있는 아이가 후계자가 될 것이다이 경우 :
는 노드
노드는 바로 아이가 두 가지 경우가 있습니다.
노드에는 하위 노드가 없습니다. 상위 노드로 이동하여이 노드가 왼쪽 하위 트리의 일부인 노드를 찾으십시오.
public Node sucessor(Node node) {
Node sucessor = null;
if (node.getRightNode() != null) {
Node newNode = node.getRightNode();
while (newNode != null) {
sucessor = newNode;
newNode = newNode.getLeftNode();
}
} else {
sucessor = findRightParent(node);
}
return sucessor;
}
private Node findRightParent(Node node) {
Node newNode = null;
if (node.getParentNode() != null) {
if (node.getParentNode().getLeftNode() == node) {
newNode = node.getParentNode();
} else {
newNode = findRightParent(node.getParentNode());
}
}
return newNode;
}
지금 삭제 로직
public void deleteNode(Node node) {
// Node is a leaf node //
if(node.getLeftNode() == null && node.getRightNode() == null){
if(isRightNode(node.getParentNode(), node)){
node.getParentNode().setRightNode(null);
}else{
node.getParentNode().setLeftNode(null);
}
// Only left child is there//
}else if(node.getLeftNode() != null && node.getRightNode() == null){
if(isRightNode(node.getParentNode(), node)){
node.getParentNode().setRightNode(node.getLeftNode());
}else{
node.getParentNode().setLeftNode(node.getLeftNode());
}
// Only Right child is there //
}else if(node.getLeftNode() == null && node.getRightNode() != null){
if(isRightNode(node.getParentNode(), node)){
node.getParentNode().setRightNode(node.getRightNode());
}else{
node.getParentNode().setLeftNode(node.getRightNode());
}
// Both Left and Right children are their//
}else{
Node psNode = predessor(node);
deleteNode(psNode);
psNode.setParentNode(node.getParentNode());
psNode.setLeftNode(node.getLeftNode());
psNode.setRightNode(node.getRightNode());
if(isRightNode(node.getParentNode(), node)){
node.getParentNode().setRightNode(psNode);
}else{
node.getParentNode().setLeftNode(psNode);
}
}
}
용액 http://coder2design.com/binary-tree/
에서 가져는 또한 전체 소스 코드를 탐색하고, 삽입의 흐름을 설명했다.
이 프로그램은 작동하지만 다른 접근 방식을 사용합니다. 누군가 제가 왜 투표에 실패했는지 말할 수 있습니까? –