#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <stack>
#define ARRAY_MAX 100
using namespace std;
//二叉树的二叉链表存储表示
typedef struct BiTNode {
char data;
struct BiTNode* lchild, * rchild; //左右孩子指针
}BiTNode,*BiTree;
void welcome()
{
cout << "实验五:" << endl;
cout << "1.以二叉链表作为存储结构,求数的高度" << endl;
cout << "2.用向量存储n结点的完全二叉树,用非递归算法进行前序遍历" << endl;
cout << "3.以二叉链表作为存储结构,用非递归实现前、中、后序遍历" << endl;
}
void CreateBiTree(BiTree &T)
{
char ch;
cin >> ch;
if (ch == '#') T = NULL;
else {
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void display(BiTree& T)
{
if (T)
{
cout << T->data<<' ';
display(T->lchild);
display(T->rchild);
}
}
int Depth(BiTree &T)
{
if (!T) return 0;
else
{
int m = Depth(T->lchild);
int n = Depth(T->rchild);
if (m > n) return (m + 1);//取深度大的子树
else return (n + 1);
}
}
void Cmp_DLR()
{
int n;
cout << "请输入节点个数:";
cin >> n;
char tree[ARRAY_MAX];
for (int i = 0; i < n; i++)
cin >> tree[i];
cout << "先序遍历为:" << endl;
int flag = 0;//记录当前结点的遍历位置,0 刚遍历到这个结点,1 已经遍历完成该结点的左儿子,2 已经遍历完成该结点的右儿子
int count = 1;//假设tree不为空
while(!(count == 1&&flag == 2))
{
if(flag == 0)
{
cout << tree[count - 1] << " ";
if(count*2 > n)
flag = 1;
else
count = count*2;
}
else if(flag == 1)
{
if(count*2+1 > n)
flag = 2;
else
{
count = count*2+1;
flag = 0;
}
}
else if(flag == 2)
{
if(count%2 == 0)
flag = 1;
else
flag = 2;
count = count/2;
}
}
cout << endl;
getchar();
}
void FirstOrder(BiTree T) {
stack <BiTree> myStack;
while (!myStack.empty() || T) {
if (T) {
cout << T->data << " ";
myStack.push(T);
T = T->lchild;
}
else {
T = myStack.top();
myStack.pop();
T = T->rchild;
}
}
}
void MiddleOrder(BiTree T) {
stack<BiTree> myStack;
while (T || !myStack.empty()) {
if (T) {
myStack.push(T);
T = T->lchild;
}
else {
T = myStack.top();
myStack.pop();
cout << T->data << " ";
T = T->rchild;
}
}
}
//后序非递归遍历
void LastOrder(BiTree T) {
stack<BiTree> myStack;
BiTree prior = NULL;
while (T || !myStack.empty()) {
if (T) {
myStack.push(T);
T = T->lchild;
}
else {
T = myStack.top();
if (T->rchild && T->rchild != prior) {
T = T->rchild;
}
else {
//T = myStack.top();
myStack.pop();
cout << T->data << " ";
prior = T;
T = NULL;
}
}
}
}
int main()
{
int x;
flag:
system("cls");
welcome();
cout << endl;
cout << "请选择:";
int op;
cin >> op;
switch (op)
{
case 1:
BiTree T1;
cout << "请用前序遍历建立二叉树:" << endl;
CreateBiTree(T1);
cout << "二叉树建立成功!" << endl;
display(T1);
cout << endl;
cout << "它的高度为:" << Depth(T1) << endl;
cout << "【系统提示】退出请按0,否则输入任意键继续";
cin >> x;
if (x == 0) return 0;
else
goto flag;
case 2:
Cmp_DLR();
cout << "【系统提示】退出请按0,否则输入任意键继续";
cin >> x;
if (x == 0) return 0;
else
goto flag;
case 3:
BiTree T3;
cout << "请用前序遍历建立二叉树:" << endl;
CreateBiTree(T3);
cout << "二叉树建立成功!" << endl;
cout << "前序遍历为:" << endl;
FirstOrder(T3);
cout << endl;
cout << "中序遍历为:" << endl;
MiddleOrder(T3);
cout << endl;
cout << "后序遍历为:" << endl;
LastOrder(T3);
cout << endl;
cout << "【系统提示】退出请按0,否则输入任意键继续";
cin >> x;
if (x == 0) return 0;
else
goto flag;
}
}
数据结构 实验五
最新推荐文章于 2024-08-26 20:24:23 发布