2012-02-21 8 views
5

이진 검색 트리에서 일하고 있습니다. 나는 위의 방법에서 방법 signatire단일 포인터 대신 이중 포인터 사용

void InsertNode(TREENODE **root,int data); 

다음 한

typedef struct TreeNode 
{ 
int num; 
struct TreeNode *left,*right; 
}TREENODE; 

트리에서 노드를 삽입하려면 왜 우리가 할 :

그래서, 여기에 노드를 나타 내기 위해 사용되는 구조는 이중 포인터가 필요합니다. 우리는 하나의 포인터를 사용할 수 있습니다!

중복을 피하기 위해 이중 포인터를 사용하고 있습니까?

+0

사운드 의심 숙제처럼 ... – Nick

+0

는 그것이 @Nick하지만 질문 유효합니다. – Andrey

+0

그런 다음 @Anirudha처럼 – Nick

답변

7

아니요, 리 밸런싱의 경우 필요합니다. 균형을 조정 한 후 루트를 변경할 수 있습니다.

좋아요, 확장하겠습니다. 이중 포인터를 사용하면 포인터를 수정할 수 있습니다. 그렇다면 나무 뿌리는 무엇입니까? TREENODE의 포인터. 검색과 같은 일부 작업은 절대로 수정하지 않습니다. 그러나 일부 작업 은 다른 노드가 새로운 루트가되도록 변경해야 할 수도 있습니다. 따라서 사용자는 루트로 사용하는 변수에 액세스해야합니다. 그들이 필요로하는 이유 중 하나는 재조정입니다 (AVL trees 참조).

+2

this. 포인터를 사용하면 루트 노드는 항상 인수로 지정한 노드를 가리 킵니다. 그러나 일부 균형을 맞추면 루트 노드가 변경되고 루트에 대한 포인터도 변경해야합니다. 포인터에 포인터가 필요한 이유가 그 때문입니다. (뿌리는 입력 변수 일뿐 아니라 출력도 분명합니다.) – Hayt

+1

@Hayt Andrey ... thxxx ... u people r genius ... – Anirudha

+0

반드시 "재조정"하는 것은 아닙니다. 누가 거기에 구현 된 재조정이 있다고 말했습니까? 빈 트리에 맨 처음 삽입하면 루트가 null 포인터에서 null이 아닌 포인터로 바뀌는 것은 단순한 사실 일 수 있습니다. – AnT

2

더블 포인터가 필요하면 포인터가 가리키는 포인터를 수정해야합니다.

0

매우 나무를 어떻게 사용 하느냐에 달려 있습니다. 트리가 일종의 정렬을 유지해야하는 경우 삽입은 루트 노드를 변경할 수 있으므로 이중 포인터가 필요합니다.

+0

예 .. 정렬 된 나무 .. – Anirudha

2

아니요 - 포인터를 수정할 수 있도록 이중 지점을 사용하고 있습니다.

0

"이중 포인터"를 사용하면 <some_class>*에 주소가있는 메모리 내용을 변경할 수 있습니다. 그래서 우리는 기본적으로 함수 호출 밖에서도 메모리 위치의 상태를 보존합니다. 다른 용도는 예를 들어과 같습니다. char* 당신은 다른 스레드에서 내 대답을 찾을 수 있습니다

char** (문자열의 로 배열) (문자열 등) : Why use double pointer? or Why use pointers to pointers?