说明:
二叉树的常见遍历有四种:前、中、后、层序遍历。
它们是最基本的,学会这些遍历后才能使用二叉树来做一些任务。
下面是遍历的代码部分。大概思路为:首先建立二叉树,用数组保存下来,然后在数组上进行操作;其次将数组保存的二叉树导入链表中,然后在链表上进行操作。
另外,还有一些地方未完成,等完成后在加上。
注:
(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,使用模板函数,使用范