두 갈래 나무의 정의 및 기본 조작
16985 단어 학습 경험
두 갈래 나무의 정의 및 기본 조작
두 갈래 나무는 또 다른 나무 구조로 그 특징은 매 결점마다 두 그루의 나무만 있고 두 갈래 나무의 나무는 좌우의 구분이 있으며 그 다음은 임의로 전도할 수 없다는 것이다.
1、InitBiTree(&T); 작업 결과: 구조 빈 두 갈래 나무
void InitBiTree(BiTree &T)
{
T=NULL;
}
2. DestroyBiTree(&T) 초기 조건: 두 갈래 트리 T 작업 결과: 두 갈래 트리 T 제거
void destroyBiTree(BiTree &T)
{
if(T){
destroyBiTree(T->lchild);
destroyBiTree(T->rchild);
delete T;
T = NULL;
}
}
3、CreateBiTree(&T,definition); 초기 조건:definition에서 두 갈래 트리 T의 정의 작업 결과:definition에 따라 두 갈래 트리 T 구성
void createBiTree(BiTree &T)
{
char data;
data = getchar();
if(data == '#')
{
T = NULL;
}
else
{
T = new BiTreeNode;
T->data = data;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
4. ClearBiTree(&T) 초기 조건: 두 갈래 트리 T 작업 결과: 두 갈래 트리 T를 빈 트리로 만들기
void ClearTree(Tree *T)
{
if (!*T)
{
return;
}
ClearTree(&(*T)->left);
ClearTree(&(*T)->right);
free(*T);
*T = NULL;
}
5、BiTreeEmpty(T); 초기 조건: 두 갈래 트리 T에 작업 결과가 존재합니다. 만약 T가 빈 두 갈래 트리라면 TRUE로 돌아가고 그렇지 않으면 FALSE로 돌아갑니다.
Status BiTreeEmpty(BiTree T)
{
if(T)
return FALSE;
else
return TRUE;
}
6. BiTreeDepth(T) 초기 조건: 두 갈래 트리 T 작업 결과: T 깊이를 되돌려줍니다.
int BiTreeDepth(BiTNode *T)
{
int Depth = 0;
if (T != NULL){
int leftDepth = TreeDepth(T->lChild);
int rightDepth = TreeDepth(T->rChild);
Depth = leftDepth >= righDepth?leftDepth+1:rightDepth+1;
}
return Depth;
}
7. Root(T) 초기 조건: 두 갈래 트리 T 작업 결과: T의 루트 반환
TElemType Root(BiTree T)
{
return T->data;
}
8. Value(T, e) 초기 조건: 두 갈래 트리 T가 존재하고 e는 T의 어떤 결점 작업 결과: e의 값을 되돌려줍니다.
TElemType Value(T, node)
{
return node->data;
}
9. Assign(T,&e,value) 초기 조건: 두 갈래 트리 T가 존재하고 e는 T의 어떤 결점 조작 결과: 결점 e부치value
Status Assign(Position *node,TElemType value) {
(*node)->data = value;
return OK;
}
10. Parent(T, e) 초기 조건: 두 갈래 트리 T가 존재하고 e는 T의 어떤 결점 작업 결과입니다. 만약에 e가 T의 비뿌리 결점이라면 양친을 되돌려주고 그렇지 않으면 "공"으로 되돌려줍니다.
BiTree Parent(BiTree T,BiTNode* e)
{
if(T){
if(T->data==e->data)
return NULL;
}
if(T->lchild!=NULL && T->lchild->data==e->data||T->rchild!=NULL && T->rchild->data==e->data)
return T;
else
{
BiTNode* tempP=NULL;
if(tempP=Parent(T->lchild,e))
return tempP;
if(tempP=Parent(T->rchild,e))
return tempP;
}
return NULL;
}
11、LeftChild(T,e); 초기 조건: 두 갈래 나무 T가 존재하고 e는 T의 어떤 결점 작업 결과입니다. e의 왼쪽 아이로 돌아갑니다.만약 e가 왼쪽 아이가 없다면, "빈"으로 돌아갑니다
TElemType LeftChild(BiTree T,TElemType elem) {
Position p;
p = NodePoint(T,elem);
if(p->lchild)
return p->lchild->data;
return NULL;
}
12. RightChild(T, e) 초기 조건: 두 갈래 나무 T가 존재하고 e는 T의 어떤 노드 조작 결과: e의 오른쪽 아이로 돌아간다.만약 e가 오른쪽 아이가 없다면, "빈"으로 돌아갑니다
TElemType RightChild(BiTree T,TElemType elem) {
Position p;
p = NodePoint(T,elem);
if(p->rchild)
return p->rchild->data;
return NULL;
}
13. LeftSibling(T, e) 초기 조건: 두 갈래 트리 T가 존재하고 e는 T의 어떤 결점 조작 결과: e의 왼쪽 형제를 되돌려줍니다.만약 e가 T의 왼쪽 아이이거나 왼쪽 형제가 없다면'공'으로 돌아간다.
TElemType LeftSibling(BiTree T,TElemType e)
{
TElemType a;
BiTree p;
if(T)
{
a=Parent(T,e);
p=Point(T,a);
if(p->lchild&&p->rchild&&p->rchild->data==e)
return p->lchild->data;
}
return NULL;
}
14. RightSibling(T, e) 초기 조건: 두 갈래 트리 T가 존재하고 e는 T의 어떤 결점 조작 결과: e의 오른쪽 형제로 되돌아간다.만약 e가 T의 오른쪽 아이이거나 오른쪽 형제가 없다면'공'으로 돌아간다.
TElemType LeftSibling(BiTree T,TElemType e)
{
TElemType a;
BiTree p;
if(T)
{
a=Parent(T,e);
p=Point(T,a);
if(p->rchild&&p->lchild&&p->lchild->data==e)
return p->rchild->data;
}
return NULL;
}
15. InsertChild(T, p, LR, c)의 초기 조건: 두 갈래 트리 T가 존재하고 p는 T의 어떤 결점을 가리키며 LR은 0 또는 1이고 비공 두 갈래 트리 c는 T와 교차하지 않으며 오른쪽 하위 트리는 비어 있다.작업 결과: LR이 0 또는 1이고 c가 T에서 p가 가리키는 결점의 왼쪽 또는 오른쪽 트리에 삽입됩니다.p가 가리키는 결점의 원래 왼쪽 나무나 오른쪽 나무는 c의 오른쪽 나무가 된다
Status InsertChild(Position p,int LR,BiTree c) {
if(p) {
if(LR == 0) {
c->rchild = p->lchild;
p->lchild = c;
}
else if(LR == 1) {
c->rchild = p->rchild;
p->rchild = c;
}
return OK;
}
else
return ERROR;
}
16. DeleteChild(T,p,LR) 초기 조건: 두 갈래 트리 T가 존재하고 p는 T의 어떤 결점을 가리키며 LR은 0 또는 1이다.작업 결과: LR이 0 또는 1인 경우 T에서 p가 가리키는 결점의 왼쪽 또는 오른쪽 하위 트리를 삭제합니다.
Status DeleteChild(Position p,int LR) {
if(LR == 0) {
if(p->lchild) {
DestoryBiTree(&p->lchild);
return OK;
}
}
else if(LR == 1) {
if(p->rchild) {
DestoryBiTree(&p->rchild);
return OK;
}
}
return ERROR;
}
17、PreOrderTraverse(T Visit( ) ); 초기 조건: 두 갈래 트리 T가 존재합니다.Visit는 결점 작업에 대한 응용 함수입니다.작업 결과: 모든 결점에 대한 함수visit를 한 번에 한 번만 호출합니다.visit () 가 실패하면 작업이 실패합니다
Status PostOrderTraverse(BiTree T,Status (*visit)(TElemType elem)) {
if(T) {
if(PostOrderTraverse(T->lchild,visit))
if(PostOrderTraverse(T->rchild,visit))
if(visit(T->data))
return OK;
return ERROR;
}
return OK;
}
18、InOrderTraverse(T, Visit( ) ); 초기 조건: 두 갈래 트리 T가 존재하고 Visit는 결점 작업에 대한 응용 함수입니다.작업 결과: 모든 결점에 대한 함수visit를 한 번, 한 번만 호출합니다.visit () 가 실패하면 작업이 실패합니다
Status InOrderTraverse(BiTree T,Status (*visit)(TElemType elem)) {
if(T) {
if(InOrderTraverse(T->lchild,visit))
if(visit(T->data))
if(InOrderTraverse(T->rchild,visit))
return OK;
return ERROR;
}
return OK;
}
19、PostOrderTraverse(T,Visit()); 초기 조건: 두 갈래 트리 T가 존재하고 Visit는 결점 작업에 대한 응용 함수입니다.작업 결과: 모든 결점에 대한 함수visit를 한 번 호출하고 한 번만 호출합니다.visit () 가 실패하면 작업이 실패합니다
Status PostOrderTraverse(BiTree T,Status (*visit)(TElemType elem)) {
if(T) {
if(PostOrderTraverse(T->lchild,visit))
if(PostOrderTraverse(T->rchild,visit))
if(visit(T->data))
return OK;
return ERROR;
}
return OK;
}
20、LevelOrderTraverse(T, Visit( ) ); 초기 조건: 두 갈래 트리 T가 존재하고 Visit는 결점 작업에 대한 응용 함수입니다.작업 결과: 각 결점에 대한 함수visit를 한 번에 한 번만 호출합니다.visit () 가 실패하면 작업이 실패합니다
Status LevelOrderTraverse(BiTree T,Status (*visit) (TElemType elem)) {
if(T == NULL)
return ERROR;
LinkQueue TreeQueue;
ElemType p;
InitQueue(&TreeQueue);
p = T;
EnQueue(&TreeQueue,p);
while(!QueueEmpty(TreeQueue)) {
DeQueue(&TreeQueue,&p);
if(p) {
visit(p->data);
EnQueue(&TreeQueue,p->lchild);
EnQueue(&TreeQueue,p->rchild);
}
}
return OK;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
일반 그룹을 json 데이터 형식으로 어떻게 변환합니까(대전제, 당신은 데이터의 형식을 당신이 변환하고 싶은 json 데이터 형식의 모양으로 변환하고 가장 어리석은 방법으로 당신이 변환하고 싶은 데이터를 json 모양으로 결합시켜야 합니다. 예를 들어 (장삼, 이사, ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.