数据结构 - 二叉树 - 遍历算法代码

本文介绍了二叉树的四种遍历方法:前序、中序、后序和层序遍历。讲解了如何用数组保存二叉树结构,以及将数组转换为链表进行遍历的操作。主要内容包括遍历算法的代码实现,以及在实际操作中的注意事项,如数组初始化和完全二叉树的存储方式。
摘要由CSDN通过智能技术生成

说明:

二叉树的常见遍历有四种:前、中、后、层序遍历。
它们是最基本的,学会这些遍历后才能使用二叉树来做一些任务。
下面是遍历的代码部分。大概思路为:首先建立二叉树,用数组保存下来,然后在数组上进行操作;其次将数组保存的二叉树导入链表中,然后在链表上进行操作。

另外,还有一些地方未完成,等完成后在加上。

注:

(1)main函数首先定义了数组的最大长度MaxSize=100;
(2)将数组初始化全为-1(其实初始化为0最好,就是后面保存二叉树时结点空的表示方法,原因看代码就知道了);
(3)二叉树保存到数组中时,保存的是完全二叉树的形式,没有结点的地方设置为0。输入-1表示保存完成并退出。

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;


// 定义相关不变量
using ElemType = int; // 树结点保存值的类型,可以修改
enum Flage{ LEFT, RIGHT };// 两次会晤法的后序遍历中使用
const int ROOT = 0;// 根节点的序号
const int INIT = -1;// 数组初始化值
const int EMPTY = 0;// 某结点为空的表示
const int MaxSize = 100;//数组最大值


/*****************************************定义结构**********************************************/
template<class T>//定义二叉树结点类型
struct TreeNode{
	TreeNode(T val) :data(val)
	{
		lchild = nullptr;
		rchild = nullptr;
	}

	T data;
	TreeNode<T> *lchild;
	TreeNode<T> *rchild;
};

template<class T>//定义栈中的每个结点的类型
struct StackElem{
	TreeNode<T> * pnode;
	Flage flage;
};

template<class T>//栈:不能将模板函数的定义和声明放在不同文件中
struct Stack{
	Stack():top(-1) {}
	inline bool empty(void)
	{
		return top == -1 ? true : false;
		// or return top == -1;
	}
	inline bool full(void)
	{
		return top >= MaxSize - 1;
	}
	bool push(T pNode)
	{
		if (!full())
		{
			data[++top] = pNode;
			return true;
		}

		return false;
	}
	T getop(void)
	{
		return data[top];
	}
	void pop(void)
	{
		if (!empty())
			--top;
		return;
	}

	T data[MaxSize];
	int top;
};

template<class T> //非循环队列,建议用循环队列做,不然死的很惨!!!!
struct Quene{
	Quene()
	{
		first = 0;
		end = 0;
	}
	bool empty()
	{
		if (first == -1 || first == end)
			return true;
		else
			return false;
	}
	bool full()
	{
		return  end >= MaxSize;
	}
	T getop()
	{
		if (first >= 0)
			return data[first];
		else
			exit(-1);
	}
	bool pop()
	{
		if (empty())
			return false;
		++first;
		return true;
	}
	void push(T val)
	{
		if (full())
			exit(-1);
		data[end++] = val;
		return;
	}

	T data[MaxSize];
	int first;
	int end;//尾指针指向左后一个元素的下一个位置
};

/**********************************************generate tree***********************************************/
void InitSqBiTree(ElemType *tree)//初始化
{
	for (int i = ROOT; i < MaxSize; ++i)
	{
		tree[i] = EMPTY;
	}
	return;
}
void CreateSqBiTree(ElemType *tree)//将树存入数组中
{
	int i = ROOT;
	while (i < MaxSize && cin >> tree[i] && tree[i] != INIT)
		++i;
	return;
}
inline bool IsEmpty(const ElemType *tree)//判断是否为空树
{
	if (tree[ROOT] == EMPTY || tree[ROOT] == INIT)
		return true;
	return false;
}
void ShowSqBiTree(const ElemType *tree)//按数组序号输出
{
	int i = ROOT;

	while (tree[i] != INIT && i < MaxSize)
		cout << tree[i++] << " ";
	cout << endl;

	return;
}
template<class T>
inline void Show(TreeNode<T> *pNode)
{
	cout << pNode->data << " ";
	return;
}

/**********************************************遍历二叉树***************************************************/
//遍历函数1
void Array_PreOrder_DiGui(const ElemType *tree, int n = 1);//递归算法;声明处写默认参数,定义处不能再写了,否则报错。
void Array_PreOrder_Stack(const ElemType *tree);//非递归算法
void Array_InOrder_DiGui(const ElemType *tree, int node = 1);
void Array_InOrder_Stack(ElemType *tree);
void Array_PostOrder_DiGui(ElemType *tree, int node = 1);
void Array_LevelOrder_Quene(ElemType *tree);

//遍历函数2,使用模板函数,使用范
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值