【遍历二叉树的非递归算法,二叉树的层次遍历】

遍历二叉树的非递归算法

先序遍历序列建立二叉树的二叉链表

中序遍历非递归算法
二叉树中序遍历的非递归算法的关键:在中序遍历过某个结点的整个左子树后,如何找到该结点的根以及右子树。
基本思想:
(1)建立一个栈
(2)根结点进栈,遍历左子树
(3)根结点出栈,输出根结点,遍历右子树。

二叉树的层次遍历

对于一棵二叉树来说,从根结点开始从左到右,从上到下。
每个结点只访问一次。
在这里插入图片描述
算法设计思路:
1.按节点进队;
2.队不空时循环:从队列中出列一个结点*p,访问它:①若他有左孩子结点,将左孩子结点进队。②若它有右孩子,将右孩子先进队。

#include<iostream>
using namespace std;
#define TElemType int

typedef struct BiNode {
	TElemType data;
	struct BiNode* lchild, * rchild;//左右孩子指针
}BiNode,*BiTree;

//菜单
void menu() {
	cout << "1.初始化" << endl;
	cout << "2.创建树" << endl;
	cout << "3.复制树" << endl;
}

//初始化
void initList(BiTree T) {
	T = new BiNode;
	if (!T) {
		exit(0);//开辟空间失败
	}
	else {
		T->data = 0;
	}
}

//创建树
BiTree createLink(){
	BiTree T;
	int data;
	cout << "请输入data的值:" << endl;
	cin >> data;
	if (data == -1) {
		//说明他的下子树不再存东西
		return NULL;
	}
	else {
		T = new BiNode;
		T->data = data;
		cout << "请输入左子树的值:" << endl;
		cin >> data;
		T->lchild = createLink();
		cout << "请输入右子树的值:" << endl;
		cin >> data;
		T->rchild = createLink();
		return T;
	}
}

//复制二叉树
int Copy(BiTree T, BiTree& NewT) {
	if (T == NULL) {
		NewT = NULL;
		return 0;
	}
	else {
		NewT = new BiNode;
		NewT->data = T->data;
		Copy(T->lchild, NewT->lchild);
		Copy(T->rchild, NewT->rchild);
	}
}




//int PreOderTraverse(BiTree T) {
//	if (T == NULL) {
//		return 1;
//	}
//	else {
//		cout << "输出T的头结点的值:" << T->data;
//		PreOderTraverse(T->lchild);//递归调用左子树
//		PreOderTraverse(T->rchild);//递归调用右子树
//	}
//}

int main() {
	int choose = 1;
	BiTree T;
	T = new BiNode;
	while (true) {
		menu();
		cout << "请输入您选择的功能:" << endl;
		cin >> choose;
		switch (choose)
		{
		case 1:
			initList(T);
			cout << "初始化成功!" << endl;
			break;
		case 2:
			createLink();
			cout << "创建成功!" << endl;
			break;
		default:
			break;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值