二叉树节点和二叉树类的定义如下
#include<iostream>
using namespace std;
const int Maxsize = 100;
template<class T>
struct BiNode {
T data;
BiNode<T>*rch;
BiNode<T>*lch;
};
template<class T>
class Bitree {
private:
void Create(BiNode<T>*&R, T data[], int n);
void Release(BiNode<T>*R);
public:
BiNode<T>*Root;
Bitree(T data[]) { Create(Root, data, 1); }
~Bitree() { Release(Root); }
};
用递归的方式来生成和销毁二叉树类
template<class T>void Bitree<T>::Create(BiNode<T>*&R, T data[], int i) {
if (data[i - 1] != 0) {//如果元素不为零,则执行
R = new BiNode<T>;//为节点申请动态内存
R->data = data[i - 1];
R->lch = R->rch = NULL;
Create(R->lch, data, 2 * i);//递归遍历
Create(R->rch, data, 2 * i + 1);
}
}
template<class T>void Bitree<T>::Release(BiNode<T>*R) {
if (!R) {
Release(R->lch);
Release(R->rch);
delete R;
}
}
用递归的方式进行遍历由于前序和中序,后序遍历的算法一样,只需要改变一下位置即可,以前序遍历为例。
template<class T>void PreOrder(BiNode<T>*&R)
{
if (R) {
cout << R->data ;
PreOrder(R->lch);
PreOrder(R->rch);
}
cout << 0;
}
用非递归的方式实现各种遍历方式
前序遍历:
用栈的先进后出的思想来实现
1.定义一个存放节点的数组(栈),并将根节点入栈,在栈顶。
2.然后栈顶出栈,在出栈的同时,其左右孩子入栈,由于先进后出的思想,先让右孩子进栈。
3.若栈不为空,则一直进行2
代码
template<class T>void PreOrder(BiNode<T>*R) {
BiNode<T>*stack[Maxsize];
int top = -1;
BiNode<T>*p;
if (R != NULL)
{
stack[++top] = R;
while (top != -1) {
p = stack[top--];
cout << p->data<<' ';
if (p->rch != NULL)stack[++top] = p->rch;
if (p->lch != NULL)stack[++top] = p->lch;
}
}
}
中序遍历:
1.定义一个栈和一个工作指针,根节点入栈,工作指针指向根节点。
2.进入当栈非空或工作节点不为NULL时,开始循环。
2.1工作指针的左孩子,左孩子的左孩子依次进栈,直到没有左孩子的节点。
2.2访问并将该节点出栈,并将工作节点指向右孩子节点。
2.3下一次循环:判断是否有右孩子节点及右孩子节点是否有孩子节点,若不存在右孩子节点,则返回到上一节点。继续循环。
template<class T>void InOrder(BiNode<T>*R) {
BiNode<T>*stack[Maxsize];
int top = -1;
BiNode<T>*p=R;
cout << "中序遍历";
while (top != -1 || p != NULL) {
while (p) {
stack[++top] = p;
p = p->lch;
}
if (top != -1) {
p = stack[top--];
cout << p->data<<' ';
p = p->rch;
}
}
}