数据结构 实验五

#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;
	}
		
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值