树-二叉树创建与遍历

数据结构-遍历二叉树的基本操作

InitTreeNode(BiTree &T)

CreateBiTree(BiTree& T)

Visit(BiTree T)

PreOrder(BiTree T)

InOrder(BiTree T)

PostOrder(BiTree T)

LevelOrderQueue(BiTree T) 队列实现层次遍历

LevelOrderRecursion(BiTree T) 递归实现层次遍历

#include <iostream>
#include<queue>
using namespace std;
#define ElemType int

//binary tree二叉树
typedef struct BiTNode {
	ElemType data;
	BiTNode* lchild, * rchild;
}BiTNode, * BiTree;


//递归初始化结点,时间复杂度O(n)
bool InitTreeNode(BiTree& T) {
	ElemType e;
	scanf("%d", &e);
	if (e == -1) {
		T = NULL;
	}
	else {
		T = new BiTNode;
		T->data = e;
		InitTreeNode(T->lchild);
		InitTreeNode(T->rchild);
	}
	return true;
}
//初始化二叉树,时间复杂度O(1)
bool CreateBiTree(BiTree& T) {
	printf("请按照先序遍历输入树结点数据(空格隔开,节点输入-1):");
	InitTreeNode(T);
	printf("初始化完成!\n");
	return true;
}
//访问结点数据,时间复杂度O(1)
bool Visit(BiTree T) {
	printf("%d ", T->data);
	return true;
}
//前序遍历,时间复杂度O(n)
bool PreOrder(BiTree T) {
	if (T != NULL) {
		Visit(T);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
	return true;
}
//中序遍历,时间复杂度O(n)
bool InOrder(BiTree T) {
	if (T != NULL) {
		InOrder(T->lchild);
		Visit(T);
		InOrder(T->rchild);
	}
	return true;
}
//后序遍历,时间复杂度O(n)
bool PostOrder(BiTree T) {
	if (T != NULL) {
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		Visit(T);
	}
	return true;
}
/*队列实现层次遍历
* 实现思路:父亲入队,左右儿子存在则入队,访问队头的父亲,然后弹出队头父亲
*/
bool LevelOrderQueue(BiTree T) {
	if (T != NULL) {
		queue<BiTNode> q; //C++STL泛型编程容器,队列容器
		q.push(*T);//首先根结点入队
		while (!q.empty())//队列非空
		{
			BiTNode temp = q.front();
			if (temp.lchild != NULL) { //队列先进先出,先入左孩子
				q.push(*temp.lchild);
			}
			if (temp.rchild != NULL) { //队列先进先出,后入右孩子
				q.push(*temp.rchild);
			}
			q.pop(); //父节点出队
			printf("%d ", temp.data);
		}
	}
	return true;
}

/*我的想法
* 递归实现层次遍历
* 实现思路:根节点只访问一次,左右孩子结点先访问,再递归访问孩子的孩子,就是一层一层访问,使用递归
*/
bool flag = true;
bool LevelOrderRecursion(BiTree T) {
	if (T == NULL) {
		return false;
	}
	if (T != NULL && flag == true) { //只访问一次,用于访问根节点,不然递归会重复访问左右孩子结点
		printf("%d ", T->data);
		flag = false;
	}
	if (T->lchild != NULL) { //访问左孩子
		printf("%d ", T->lchild->data);
	}
	if (T->rchild != NULL) { //访问右孩子
		printf("%d ", T->rchild->data);
	}
	LevelOrderRecursion(T->lchild); //递归访问
	LevelOrderRecursion(T->rchild); //递归访问
	return true;
}


void meue() {
	printf("------------操作菜单------------\n");
	printf("1.构造树 2.先序遍历\n");
	printf("3.中序遍历 4.后序遍历\n");
	printf("5.层次遍历(队列) 6.层次遍历(递归)\n");
	printf("--------------------------------\n");
	printf("请输入菜单序号(0退出):");
}
int main() {
	BiTree T; int choice;
	T = NULL; //没有初始化,直接用递归遍历会报错
	while (true) {
		meue();
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:CreateBiTree(T); break;
		case 2:printf(">先序遍历:"); PreOrder(T); printf("\n"); break;
		case 3:printf(">中序遍历:"); InOrder(T); printf("\n"); break;
		case 4:printf(">后序遍历:"); PostOrder(T); printf("\n"); break;
		case 5:printf(">层次遍历(队列):"); LevelOrderQueue(T); printf("\n"); break;
		case 6:printf(">层次遍历(递归):"); LevelOrderRecursion(T); printf("\n"); flag = true; break; 
		case 0:return 0;
		default:
			printf("菜单位序输入错误!\n");
		}
	}
}
/*实现例子
1 2 3 -1 -1 -1 4 5 -1 6 -1 -1 7 -1 -1
1 2 4 -1 -1 5 -1 -1 3 6 -1 -1 7 -1 -1
*/
case one

在这里插入图片描述
在这里插入图片描述

case two


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值