实验内容:
- 以二叉树链表做存储结构,设计求二叉树高度的算法。
- 一颗树n个结点的完全二叉树用向量做存储结构,用非递归算法实现对该二叉树进行前序遍历。
- 以二叉树链表做存储结构,编写非递归的前序、中序、后续遍历算法。
实验代码:
#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;
}