实验题:树的应用

实验内容:

  1. 以二叉树链表做存储结构,设计求二叉树高度的算法。
  2. 一颗树n个结点的完全二叉树用向量做存储结构,用非递归算法实现对该二叉树进行前序遍历。
  3. 以二叉树链表做存储结构,编写非递归的前序、中序、后续遍历算法。

实验代码:

#include<iostream>
#include<malloc.h>
#include<stack>

using namespace std;

#define OK 1;
#define ERROR 0;

typedef int Status;
typedef char ElementType;

//二叉树节点的定义
typedef struct bitnode {
	ElementType data;	//数据域
	struct bitnode *left, *right;	//指针域
} bitnode, *bitree;	//bitnode为结构体,bitree为结构体指针

//先序创建一颗二叉树
bitree CreateTree() {
	bitree T;
	char item;

	cin >> item;
	
	//空树标记
	if (item == '#') {	
		T = NULL;
	} else {
		T = (bitree)malloc(sizeof(bitnode));
		T->data = item;

		T->left = CreateTree();	//递归创建左子树
		T->right = CreateTree();	//递归创建右子树
	}

	return T;	//返回根节点
}

//先序周游一颗树
Status PerOrder(bitree T) {
	//T!=NULL
	if (T) {
		cout << T->data << " ";
		PerOrder(T->left);
		PerOrder(T->right);
	}

	return 1;
}

//释放树的空间
bitree FreeTree(bitree T) {
	if (T) {
		FreeTree(T->left);
		FreeTree(T->right);

		free(T);
		T = NULL;
	}

	return T;
}

//计算一棵树的高度
int TreeHeight(bitree T) {
	//空树
	if (T == NULL) {
		return 0;
	}
	if (T->left == NULL && T->right == NULL) {
		return 1;
	}

	return max(TreeHeight(T->left), TreeHeight(T->right)) + 1;
}

//1.求二叉树高度的算法
Status question_one() {
	bitree root;
	int height = 0;

	cout << "先序创建一颗二叉树,一次性输入一组数据(以空格隔开:)";
	root = CreateTree();

	cout << "先序遍历:";
	PerOrder(root);
	cout << endl;

	height = TreeHeight(root);
	cout << "树的高度为:" << height <<endl;

	root = FreeTree(root);
	if (root == NULL) {
		cout << "释放成功!" <<endl;
	}

	return 1;
}

//数组转换成二叉树
bitree CreateBitree(char *a, int n, int start) {
	if (a[start] == '#') {
		return NULL;
	}

	bitree root = (bitree)malloc(sizeof(bitnode));
	//bitree root = new bitnode;
	root->data = a[start];
	root->left = NULL;
	root->right = NULL;

	int left = 2 * start;
	int right = 2 * start  + 1;

	if (left > n - 1) {
		root->left = NULL;
	} else {
		root->left = CreateBitree(a, n, left);
	}

	if (right > n - 1) {
		root->right = NULL;
	} else {
		root->right = CreateBitree(a, n, right);
	}

	return root;
}

//非递归的先序遍历
void FirstOrder(bitree T) {
	stack<bitree> myStack;

	while (!myStack.empty() || T) {
		if (T) {
			cout << T->data << " ";
			myStack.push(T);
			T = T->left;
		
		} else {
			T = myStack.top();
			myStack.pop();
			T = T->right;
		}
	}

}
//2.前序遍历
Status question_two() {
	bitree root;

	cout << "请输入要创建的数量(int):";
	int number;
	cin >> number;

	char data[number + 1];
	data[0] = '0';
	cout << "一次性输入一组数据(以空格隔开:)";
	for (int i = 1; i < number + 1; ++i) {
		cin >> data[i];
	}
	//char data[] = {'0', '1', '2', '3', '4', '5', '#', '6', '#', '#', '7', '8'};
	root = CreateBitree(data, sizeof(data)/sizeof(data[0]), 1);

	PerOrder(root);
	cout << endl;
	
	FirstOrder(root);


	root = FreeTree(root);
	if (root == NULL) {
		cout << "释放成功!" <<endl;
	}

	return OK;
}

//中序非递归遍历
void MiddleOrder(bitree T) {
	stack<bitree> myStack;

	while (T || !myStack.empty()) {
		if (T) {
			myStack.push(T);
			T = T->left;

		} else {
			T = myStack.top();
			myStack.pop();
			cout << T->data << " ";
			T = T->right;
		}
	}

}

//后序非递归遍历
void LastOrder(bitree T) {
	stack<bitree> myStack;
	
	bitree prior = NULL;

	while (T || !myStack.empty()) {
		if (T) {
			myStack.push(T);
			T = T->left;

		} else {
			T = myStack.top();
			if (T->right && T->right!=prior) {
					T = T->right;

			} else {
				//T = myStack.top();
				myStack.pop();
				cout << T->data << " ";
				prior = T;
				T = NULL;
			}
		}

	}
}

//3.非递归的前序遍历
Status question_three() {
	bitree root;
	//int height = 0;

	cout << "先序创建一颗二叉树,一次性输入一组数据(以空格隔开:)";
	root = CreateTree();

	cout << "先序非递归遍历:";
	FirstOrder(root);
	cout << endl;

	cout << "中序非递归遍历:";
	MiddleOrder(root);
	cout << endl;

	cout << "后序非递归遍历:";
	LastOrder(root);
	cout << endl;

	return 1;
}

//主菜单
Status menu() {
	int choose_one;

	while (1) {
		printf("\n************************\n");
		printf("1.求二叉树的高度\n");	
		printf("2.前序遍历\n");
		printf("3.非递归的遍历\n");
		printf("4.退出\n");
		printf("************************\n");
		printf("请输入你的选择(1~3):");
		cin >> choose_one;

		if (choose_one == 1) {
			question_one();
		} else if (choose_one == 2) {
			question_two();
		} else if (choose_one == 3) {
			question_three();
		} else {
			break;
		}
	}

	return 1;
}

//主函数
int main() {
	menu();
	return 0;
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include //#define error 0 //#define OVERFLOW -1 //#define ok 1 #define MAXSIZE 100 typedef char TElemType; typedef int Status; typedef struct BiTNode{ //结点 TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef BiTree datatype; typedef struct { datatype data[MAXSIZE]; int top; }sqstack; typedef sqstack *STK; Status CreateBiTree(BiTree *T) { //先序建立二叉树 char ch; ch=getchar(); if(ch=='#') (*T)=NULL; //#代表空 else { (*T)=(BiTree)malloc(sizeof(BiTNode)); (*T)->data=ch; CreateBiTree(&(*T)->lchild); //先序建立左子 CreateBiTree(&(*T)->rchild); //先序建立右子 } return 1; } STK initstack() //栈的初始化 { STK s; s=(STK)malloc(MAXSIZE*sizeof(sqstack)); s->top=0; return s; //返回指向栈地址的指针 } Status stackempty(STK s) //判断栈是否为空 { return(s->top==0); } Status push(STK s,datatype *e) //压栈函数 { if(s->top==MAXSIZE) //栈满,则返回错误 return 0; else { s->data[s->top]=*e; (s->top)++; return 1; } } Status pop(STK s,datatype *e) //出栈函数 { if(stackempty(s)) //判断栈是否为空 return 0; else { s->top--; *e=s->data[s->top]; //用e接受栈顶元素 return 1; } } Status inordertraverse(BiTree T) //中序非递归遍历二叉树 { STK s; s=initstack(); // BiTree T; BiTree p; p=T; while (p||!stackempty(s)) { if(p) { push(s,&p); p=p->lchild; } else { pop(s,&p); printf("%2c",p->data); p=p->rchild; }//else }//while return 1; }//inordertraverse void main() { BiTree T=NULL; printf("\n Creat a Binary Tree .\n"); //建立一棵二叉树T* CreateBiTree( &T ); printf ("\nThe preorder is:\n"); inordertraverse(T); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值