Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 배열 구현이 있는 이진 트리


이진 트리는 트리의 각 노드가 최대 두 개의 자식 노드를 가질 수 있는 특수한 유형의 트리입니다. 이러한 자식 노드를 오른쪽 자식과 왼쪽 자식이라고 합니다.

간단한 이진 트리는 -

C++에서 배열 구현이 있는 이진 트리

나무를 나타내는 방법에는 두 가지가 있습니다.

  • 연결 목록을 사용하는 동적 노드 표현
  • 배열을 사용하는 순차 표현.

여기서는 이진 트리의 배열 표현에 대해 설명합니다. 이를 위해 BT의 노드에 번호를 매겨야 합니다. 이 번호는 0에서 (n-1) 또는 1에서 n으로 시작할 수 있습니다.

배열에서 노드와 해당 상위 및 하위 노드의 위치를 ​​파생시킵니다.

0 인덱스 기반 시퀀싱을 사용하면

상위 노드가 인덱스 p라고 가정합니다.

그러면 left_child 노드는 인덱스 (2*p)+ 1에 있습니다.

right_child 노드는 인덱스 (2*p) + 2에 있습니다.

루트 노드는 인덱스 0에 있습니다.

left_child는 인덱스 1에 있습니다.

Right_child는 인덱스 2에 있습니다.

1개의 색인 기반 시퀀싱을 사용하면

상위 노드가 인덱스 p에 있다고 가정합니다.

Right_node는 색인(2*p)에 있습니다.

Left_node는 색인(2*p)+1에 있습니다. .

루트 노드는 인덱스 1에 있습니다.

left_child는 인덱스 2에 있습니다.

Right_child는 인덱스 3에 있습니다.

#include<bits/stdc++.h>
using namespace std;
char tree[10];
int rootnode(char key){
   if(tree[0] != '\0')
      cout<<"Tree already had root";
   else
      tree[0] = key;
   return 0;
}
int leftchild(char key, int parent){
   if(tree[parent] == '\0')
      cout <<"\nCan't set child at"<<(parent * 2) + 1<<" , no parent found";
   else
      tree[(parent * 2) + 1] = key;
   return 0;
}
int rightchild(char key, int parent){
   if(tree[parent] == '\0')
      cout<<"\nCan't set child at"<<(parent * 2) + 2<<" , no parent found";
   else
      tree[(parent * 2) + 2] = key;
   return 0;
}
int traversetree(){
   cout << "\n";
   for(int i = 0; i < 10; i++){
      if(tree[i] != '\0')
         cout<<tree[i];
      else
         cout<<"-";
   }
   return 0;
}
int main(){
   rootnode('A');
   rightchild('C', 2);
   leftchild('D', 0);
   rightchild('E', 1);
   rightchild('F', 2);
   traversetree();
   return 0;
}

출력

Can't set child at6 , no parent found
Can't set child at6 , no parent found
AD--E-----