[树] 二叉树学生 – 学生二叉树

下面的代码从代码开发处 在二分搜索树的一些操作 解决建设二叉树搜索学生 (关键是学生代码). 每个学生都有学生代码, 名, 点. 浏览学生名单, 更多的学生, 除去较小的学生的分数 4
下面的代码是从延伸 在二分搜索树的一些操作 建立学生二叉树 (关键是学生的ID). 有学生ID, 名字和分数. 遍历树, 添加学生,并删除所有的学生都有得分小 4
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct item {
	char id[20];
	char name[20];
	double scores;
};
struct Node {
	item key; //truong key cua du lieu
	Node *Left, *Right; //con trai va con phai
};
typedef Node *Tree;  //cay

int compare(item x, item y) { // so sanh 2 item theo key
	return strcmp(x.id, y.id);
}

item inputItem() {	// nhap 1 item
	item x;
	char id[20];
	printf("Enter id of student (q to quit): ");
	gets(x.id);

	if (strcmp(x.id, "q") == 0 || strcmp(x.id, "Q") == 0) {
		return x;
	}

	printf("Enter name of student: ");
	gets(x.name);

	printf("Enter scores of student:");
	scanf("%lf", &x.scores);

	//fflush(stdin);
	while (getchar() != '\n');

	return x;
}

void outItem(item x) {
	printf("%-20s %-20s %-3.2f \n", x.id, x.name, x.scores);
}

int insertNode(Tree &T, item x) // chen 1 Node vao cay
		{
	if (T != NULL) {
		if (compare(T->key, x) == 0)
			return -1;  // Node nay da co
		if (compare(T->key, x) > 0)
			return insertNode(T->Left, x); // chen vao Node trai
		else if (compare(T->key, x) < 0)
			return insertNode(T->Right, x);   // chen vao Node phai
	}
	T = (Node *) malloc(sizeof(Node));
	if (T == NULL)
		return 0;    // khong du bo nho
	T->key = x;
	T->Left = T->Right = NULL;
	return 1;   // ok
}

void CreateTree(Tree &T)        // nhap cay
		{
	item x;
	while (1) {
		printf("Enter a student: ");
		x = inputItem();
		if (strcmp(x.id, "q") == 0 || strcmp(x.id, "Q") == 0)
			break;  // x = 0 thi thoat
		int check = insertNode(T, x);
		if (check == -1)
			printf("Student is exits!");
		else if (check == 0)
			printf("Memory full");

	}
}

// Duyet theo LNR
void LNR(Tree T) {
	if (T != NULL) {
		LNR(T->Left);
		outItem(T->key);
		LNR(T->Right);
	}
}

Node* searchScores(Tree T, int scores)     // tim nut co diem < 4
		{
	if (T != NULL) {
		if (T->key.scores < scores) {
			Node *P = T;
			return P;
		}
		if (T->key.scores >= scores) {
			Node *node = searchScores(T->Left, scores);
			if (node != NULL)
				return node;
			else {
				return searchScores(T->Right, scores);
			}
		}
	}
	return NULL;
}

int delKey(Tree &T, item x)     // xoa nut co key x
		{
	if (T == NULL)
		return 0;
	else if (compare(T->key, x) > 0)
		return delKey(T->Left, x);
	else if (compare(T->key, x) < 0)
		return delKey(T->Right, x);
	else // T->key == x
	{
		Node *P = T;
		if (T->Left == NULL)
			T = T->Right;    // Node chi co cay con phai
		else if (T->Right == NULL)
			T = T->Left;   // Node chi co cay con trai
		else // Node co ca 2 con
		{
			Node *S = T, *Q = S->Left;
			// S la cha cua Q, Q la Node phai nhat cua cay con trai cua P
			while (Q->Right != NULL) {
				S = Q;
				Q = Q->Right;
			}
			P->key = Q->key;
			S->Right = Q->Left;
			delete Q;
		}
	}
	return 1;
}

int main() {
	Tree T;
	T = NULL; //Tao cay rong

	CreateTree(T); //Nhap cay
	//duyet cay
	printf("LNR: \n");
	LNR(T);
	printf("\n");

	// them sinh vien
	item x;
	printf("Enter id of student to add: ");
	x = inputItem();
	if (insertNode(T, x) == -1) {
		printf("add failt!");
	} else {
		printf("add success:\n");
		printf("LNR after add item: \n");
		LNR(T);
		printf("\n");
	}

	// xoa sinh vien co diem nho hon 4
	int del = 1;
	while (del) {
		Node* node = searchScores(T, 4);
		if (node != NULL) {
			printf("del");
			del = delKey(T, node->key);
		} else {
			printf("null");
			del = 0;
		}
	}
	printf("LNR after delete item: \n");
	LNR(T);
	printf("\n");
	return 0;
}