2-d树

数据结构与算法分析——c语言描述 练习4.46 b c 答案


终于把树的课后习题全部刷完了。。。


2-d_tree.h

#include<string>
typedef std::string ElementType;

#ifndef _Tree_H
#define _Tree_H

struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *TwoDTree;

void makeEmpty(TwoDTree t);
Position find(ElementType X1,ElementType X2, TwoDTree t);

TwoDTree insert(ElementType X1, ElementType X2, TwoDTree t);
void dir(TwoDTree t);
void printSelect(ElementType low1, ElementType high1, ElementType low2, ElementType high2,TwoDTree t);

#endif



2-d_tree.cpp

#include"2-d_tree.h"
#include"fatal.h"
#include<iostream>
struct TreeNode {
	ElementType element1;
	ElementType element2;
	TwoDTree left;
	TwoDTree right;
};

void makeEmpty(TwoDTree t) {
	if (t) {
		makeEmpty(t->left);
		makeEmpty(t->right);
		free(t);
	}
}

Position find(ElementType X1, ElementType X2, TwoDTree t) {
	int layer = 0;
	if (t == NULL) {
		return NULL;
	}
	while (t) {
		if (layer % 2 == 0) {
			if (X1 < t->element1)
				t = t->left;
			else if (X1 > t->element1)
				t = t->right;
			else {
				if (X2 == t->element2)
					return t;
				else
					return NULL;
			}
			layer++;
		}
		else {
			if (X2 < t->element2)
				t = t->left;
			else if (X2 > t->element2)
				t = t->right;
			else {
				if (X1 == t->element1)
					return t;
				else
					return NULL;
			}
			layer++;
		}
	}
	return NULL;
}


static Position newNode(ElementType X1, ElementType X2) {
	TwoDTree t = new TreeNode;
	if (t == NULL)
		Error("out of memory");
	t->element1 = X1;
	t->element2 = X2;
	t->left = NULL;
	t->right = NULL;
	return t;
}

TwoDTree insert(ElementType X1, ElementType X2, TwoDTree t) {
	int layer = 0;
	Position fater = NULL;
	Position son = t;
	if (t == NULL) {//包含树没有初始化
		t = newNode(X1, X2);
	}
	else {
		while (son) {
			if (layer % 2 == 0) {
				if (X1 < son->element1) {
					fater = son;
					son = son->left;
				}
				else if (X1 > t->element1) {
					fater = son;
					son = son->right;
				}
				else
					return t;
			}
			else {

				if (X2 < son->element2) {
					fater = son;
					son = son->left;
				}
				else if (X2 > son->element2) {
					fater = son;
					son = son->right;
				}
				else {
					return t;
				}

			}
			layer++;
		}
		son = newNode(X1, X2);
		if (fater) {
			if (layer % 2 == 0) {//爸爸比较的是奇数
				if (X2 < fater->element2)
					fater->left = son;
				else
					fater->right = son;
			}
			else {
				if (X1 < fater->element1)
					fater->left = son;
				else
					fater->right = son;
			}
		}
	}


	return t;//两种情况
}

void dir(TwoDTree t) {
	if (t) {
		dir(t->left);
		std::cout << t->element1 << " " << t->element2 << std::endl;
		dir(t->right);
	}
}

void printSelect(ElementType low1, ElementType high1, ElementType low2, ElementType high2, TwoDTree t) {
	if (t) {
		if (low1 <= t->element1&&low2 <= t->element2)
			printSelect(low1, high1, low2, high2,t->left);
		if(low1 <= t->element1&&t->element1<=high1&&low2 <= t->element2&&t->element2 <= high2)
			std::cout << t->element1 << " " << t->element2 << std::endl;
		if (t->element1 <= high1&&t->element2 <= high2)
			printSelect(low1, high1, low2, high2, t->right);
	}
}




main.cpp

#include"2-d_tree.h"
#include<iostream>

int main() {
	
	TwoDTree t = NULL;

	t = insert("Harry", "Truman", t);
	t = insert("Dwight", "Eisenhower", t);
	t = insert("John", "Kennedy", t);
	t = insert("Lyndon", "Johnson", t);
	t = insert("Richard", "Nixon", t);
	t = insert("Gerald", "Ford", t);
	t = insert("Jimmy", "Carter", t);
	t = insert("Ronald", "Reagan", t);
	t = insert("George", "Bush", t);
	t = insert("Bill", "Clinton", t);
	//dir(t);
	printSelect("A", "Z", "A", "Z", t);
	
	
}


你可能感兴趣的:(2-d树)