Member 13750476 Ответов: 2

Как напечатать двоичное дерево на языке Си с дизайном слева направо?


Мне нужно напечатать двоичное дерево, которое выглядит следующим образом
                          WP
                  WA
                          SW
                               SG
        RR
                          RE
                  PI
                          KN
                               KA
HN
                          HI
                  GU
                          GA
                               DV
        CX
                          BO
                  AS


Что я уже пробовал:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int found=0;

struct BstNode{
	char initial[5];
	BstNode *left;
	BstNode *right;
	BstNode* parent;
}*root = NULL;

BstNode *GetNewNode(char initial[5]){
	BstNode *newNode = (BstNode*) malloc(sizeof(BstNode));
	strcpy(newNode->initial,initial);
	newNode->left = NULL;
	newNode->right = NULL;
	newNode->parent = NULL;
	return newNode;
}

void push(BstNode *curr,char initial[]){
	if(root==NULL){
		root=GetNewNode(initial);
	}else{
		if(strcmp(initial,curr->initial) < 0){
			if(curr->left==NULL){
				curr->left=GetNewNode(initial);
				curr->left->parent=curr;
			}else{
				push(curr->left,initial);
			}
		}
		else if(strcmp(initial,curr->initial) > 0){
			if(curr->right==NULL){
				curr->right=GetNewNode(initial);
				curr->right->parent=curr;
			}
			else{
				push(curr->right,initial);
			}
		}else{
			found=1;
		}
	}
}


void inOrder(BstNode *curr){
		inOrder(curr->left);
		printf("%s",curr->initial);
		inOrder(curr->right);
}

int main() {
	int choose = 0;
	
	do {
		system("cls");
		puts("1. Add Initial");
		puts("2. View Initial");
		puts("3. Exit");
		printf(">> ");
		scanf("%d", &choose); fflush(stdin);
		
		switch (choose) {
		case 1:
		char initial[5];
			puts("");
		do{
			do{
			printf("Input Initial [example: SW]: ");
			scanf("%[^\n]", &initial); fflush(stdin);
			}while(strlen(initial)!=2 || initial[0] < 'A' || initial[0] > 'Z' || initial[1] < 'A' || initial[1] > 'Z');
		found=0;
		push(root,initial);
		}while(found==1);

			getchar();
			break;
		case 2:
		
		inOrder(root);	
			getchar();
			break;
		}
	} while (choose != 3);

	// START HERE
	// ADD LOGIC FOR POP ALL DATA IN THE LINKED LIST


	// END HERE

	puts("\nThanks for using this program");
	system("pause");
	return 0;
}

OriginalGriff

В чем же проблема?
Что он делает такого, чего вы не ожидали, или не делает того, что вы сделали?
Что вы сделали, чтобы заставить его сделать это?
Что вы пытались выяснить, почему?
Что показал отладчик?
какая помощь вам нужна?

Member 13750476

это программа для отображения двоичного дерева на языке Си с интервалом, чтобы оно выглядело как дерево, но в горизонтальной ориентации. Я пытался добавить интервал, но это не сработало. Единственное, в чем я уверен, так это в том, что дерево печатается по порядку

Patrice T

Покажите, что вы получаете в качестве результата.

2 Ответов

Рейтинг:
2

KarstenK

Я бы пошел другим путем, "виртуальной печатью", и сначала вычислял бы выходные данные в памяти, а затем печатал бы их.

char buffer[20][80];// lines and columns
memset( buffer, ' ', sizeof(buffer) );//will with space char
//compute output for the tree and buffer lines correctly
//set char with correct offset
buffer[10][0] = 'H';
buffer[10][1] = 'M';

for( .. )
{
  print( buffer[i] );
}
У него есть большое преимущество, что вы можете легко отлаживать, потому что выходные данные находятся в видимом буфере.


Рейтинг:
2

Patrice T

Этот код печатает элементы дерева:

void inOrder(BstNode *curr){
		inOrder(curr->left);
		printf("%s",curr->initial);
		inOrder(curr->right);
}

вы не пытаетесь делать отступы для узлов.
Для этого вам нужно добавить уровень текущего узла. Каждый раз, когда вы печатаете дочерний узел, он имеет уровень +1.
корень-это уровень 0, а его дочерние элементы-уровень 1.
при печати каждый уровень представляет собой некоторое количество пробелов.