저는 스칼라를 모르지만 자바를 알고 있습니다.
Java 및 객체에서 종종 자동차 또는 B- 트리 등 특정 객체를 모델링합니다.
개체는이 것에 관한 데이터 (정보)를 저장합니다. 객체는 또한 데이터 (예 : 자동차 문 열림)와 관련하여 수행 할 수있는 동작을 가지며 이는 종종 사물의 상태를 변경합니다 (데이터 변경). 비헤이비어 (메소드)는 객체의 상태에 대한 정보를 알려주고 상태를 변경하지 않을 수도 있습니다. 또한 내부 데이터의 정확한 형태는 일반적으로 숨겨져 있습니다 (우수 사례).
어떤 시점에서든지 객체의 크기는 입니다.
그래서 이진 트리 객체에 대해 생각해 봅시다. 우리는 정확히 다음과 같습니다 이진 트리 (정수를 포함)가 있습니다
4
/ \
2 1
/ /\
1 3 1
그래서 어떤 방법으로 부착 된 특정 값을 가진 노드의 특정 번호를 가지고거야 어느 시점에서.
이제 바이너리 트리에 대한 정보를 저장하는 방법을 결정해야합니다. 이 작업은 각 이진 트리 객체에서 내부적으로 수행됩니다.
그래서 각 이진 트리가 몇 개의 노드로 구성 될 것입니다.
그래서 노드에 대한 정보를 저장하는 방법이 필요합니다. 이제 우리는 노드가 보유하고있는 가치와 그들이 보유하고있는 좌/우 자식을 저장할 필요가 있습니다. 두 개 이상의 정보가 포함되어 있으므로이를 객체로 저장해야합니다.
그래서 각 노드 객체는 값을위한 변수를 가질 필요가 있습니다. 왼쪽 노드의 자식이 무엇인지, 그리고 그것이 올바른 자식인지 알려주는 변수입니다.
그래서 노드 포함 정수 값을 우리가 갈 수 :
class Node {
int value;
Node left;
Node right;
}
지금 모든 노드가 왼쪽 또는 오른쪽의 자녀 (또는 자녀 모두)을해야합니다 없습니다. 왼쪽 자식의 부족은 실제 노드를 참조하기보다는 'null'값을 갖는 왼쪽 변수로 표현됩니다.
위 코드는 일반적으로 특정 상태 정보를 포함하지 않는 노드를 나타내지 만, 생성 한 특정 노드에는 'value', 'left'및 'right'변수에 대한 특정 값이 있습니다.
이제 우리는 이진 트리가 여러 노드로 구성되어 있다는 것을 알고 있습니다. 루트 노드로 시작합니다. 그러면 루트 노드에는 그 아래에있는 노드 (하위 노드)에 대한 정보 만 포함됩니다.
class BinaryTree {
Node root;
}
하지만 이진 트리 (예 : 개체)에 몇 가지 동작을 제공하여 흥미로운 것들을 수행 할 수도 있습니다. 결국 어쨌든 우리는 왜 바이너리 트리가 필요한가? - 그래서 우리는 유용한 바이너리 트리를 만들 수 있습니다!
먼저 우리는 이진 트리 객체를 만들 수 있도록 "생성자"가 필요하며 상태를 초기 값으로 설정할 수 있습니다. 그래서 우리는 이진 트리가 비어있는 채로 시작하도록 만들 것입니다. 우리는 이것을 'root'변수 null로 표현합니다. 이것은 우리가 뿌리조차 갖고 있지 않다는 것을 의미합니다! 그래서 그것은 비어 있습니다.우리는 방법 우리가 그것을 클래스 자체와 동일한 이름을 제외하고는 (클래스/객체에 속하는 기능)와 같은 형태의 생성자를 쓰기 :
우리는 아마도 우리의 바이너리를 제공 할 수 있습니다
class BinaryTree {
Node root;
BinaryTree() {
root = null; // make it so that newly made objects start off being empty
}
}
tree 객체를 몇 가지 동작/메소드로 변환하여 실제로 원하는 모든 종류의 이진 트리를 만들 수 있습니다. 오직 빈 나무를 만들 수 있고 그들을 변경하지 아마도 유용하지 않습니다!
우리는 addLeftChild (노드 addFrom, int 값) 및 addRightChild (노드 addFrom, int 값) 메소드를 만들 수 있습니다. addLeftChild는 지정된 값 (자식이없는)을 가지는 새로운 노드를 작성해, addFrom에 의해 지정된 노드의 왼쪽의 아이로합니다. 다만, 'addFrom'노드가 아직 왼쪽 아이를 가지지 않는 경우에게만 적용됩니다.
class BinaryTree {
Node root;
BinaryTree() {
root = null; // make it so that newly made objects start off being empty
}
Node addLeftChild(Node addFrom, int value) {
// change the binary tree's state somehow to achieve this
}
Node addRightChild(Node addFrom, int value) {
// change the binary tree's state somehow to achieve this
}
}
우리는 또한 새로운 루트 노드, addRoot (int 값)를 추가하는 방법이있을 수 있습니다, 그래서 우리는 먼저 이진 트리를 할 때 우리는 루트 노드를 추가 할 수 있습니다. 노드를 제거하는 메서드 (비헤이비어)가있을 수도 있습니다. 트리에서 값/노드를 검색하거나 트리에 대한 정보 (예 : 깊이, 노드 수)를 제공하는 메소드가있을 수 있습니다.
그리고 우리는 어떤 식 으로든 그들과 상호 작용, 실제로 이진 트리 객체를 만들기 위해 몇 가지 코드를 작성할 수 있습니다 예 :
// this is some main method,etc
BinaryTree ourBT = new BinaryTree(); // make an new binary tree
// remember these start off empty
Node rootNode; // variable so we can tell
// later add methods which node to add from
rootNode = ourBT.addRoot(4);
이 지금까지 우리가 이것을 줄 것 ourBT이라는 이진 트리 (단지 루트로 노드)
4
는 우리가 갈 수 있습니다
이
ourBT.addLeftChild(rootNode, 3); // remember the parameter rootNode refers
// to the root node we just added before
우리의 바이너리 트레을 떠날 것이다 이 상태의 전자가 :
4
/
3
그런 다음 우리가 갈 수 : 우리가 할 수 우리의 이진 트리를 구축 한 후 다음
4
/\
3 1
:
이
ourBT.addRightChild(rootNode, 1);
이 상태에서 우리의 이진 트리를 떠날 것이다 어쩌면 그걸로 다른 흥미로운 것들을 할 수도 있습니다 (예 : 검색, 제거)
이것은 아마도 최고의 exa는 아닙니다. mple하지만 잘하면 사용자 정의 데이터 구조가 OO 스타일로 작성된 방법에 대해 약간의 통찰력을주었습니다.
실제 질문은 무엇입니까? OO에서 B-tree는 어떻게 구현됩니까? –
아니요, 또는 OO에 relatin이 무엇입니까? 그건 상속도 아니고 작곡도 아니에요 ... 그게 뭔가요? – Bruna
질문은 나에게 충분히 분명해 보입니다. 객체 지향적 인 방식으로 위의 특성을 가진 트리를 어떻게 모델링하나요? –