二叉树头文件“Tree.h”
#pragma once
#include <iostream>
using namespace std;
#define Maxsize 10
template <typename T>
struct Btnode {
T data;
Btnode<T>* r, * l;
};
template <typename T>
using Btree = Btnode<T>*;//typedef 在于类模板配合时会比较麻烦,建议用using。
template<typename T>
void visit(Btree<T> N) {
cout << N->data << endl;
}
template<typename T>
void Settreew(Btree<T> N,int n, int i = 1) {
if (N) {
cin >> N->data;
if (2 * i < n) {
N->l = new Btnode<int>;
N->r = new Btnode<int>;
Settreew(N->l, n, 2 * i);
Settreew(N->r, n, 2 * i + 1);
}
else if (2 * i == n) {
N->l = new Btnode<int>;
Settreew(N->l, n, 2 * i);
N->r = NULL;
}
else
N->l = NULL, N->r = NULL;
}
}
template<typename Ty>
int Btdepth(Btree<Ty> T)
{
if (!T)
return 0;
int front = -1, rear = -1;//front用于记录数到哪个点,rear用于记录入队到哪个点;
int last = 0, level = 0;//last 用于记录遍历一层后,该层最右点所储存的位置的序号
Btnode<Ty>* Q[10];
Q[++rear] = T;
Btnode<Ty>* P;
while (front < rear) {
P = Q[++front];
if (P->l)
Q[++rear] = P->l;
if (P->r)
Q[++rear] = P->r;
if (front == last) {
level++;
last = rear;
}
}
return level;
}
用于遍历的栈头文件”Sqstack.h“:
#pragma once
#include <iostream>
using namespace std;
//#define Maxsize 10
#include"Tree.h"
template <typename T>
struct Snode{
Btnode<T>* p;
int rvisited;//用于记录是否已经访问过该节点
};
template <typename T>
struct Sqstack {
/*Snode<T> Elem[Maxsize];*/
Snode<T>* Elem;//用指针作为成员便于初始化
int top;
int Max;
};
template <typename T>
void Initstack(Sqstack<T> &S,int nums) {
S.Max = nums;
S.Elem= new Snode<int>[S.Max];
S.top = -1;
}
template <typename T>
bool Push(Sqstack<T>& S, Snode<T>&x) {
if (S.top == S.Max - 1)
return false;
else {
S.Elem[++S.top] = x;
return true;
}
}
template <typename T>
bool Gettop(Sqstack<T>& S, Snode<T> &x)//要实时返回到x关键节点
{
if (S.top == -1)
return false;
else {
x = S.Elem[S.top];
return true;
}
}
template <typename T>
bool Pop(Sqstack<T>& S, Snode<T> &x)//要实时返回到x关键节点
{
if (S.top == -1)
return false;
else {
x = S.Elem[S.top--];
return true;
}
}
template <typename T>
bool stackempty(Sqstack<T>& S)
{
if (S.top == -1)
return true;
else
return false;
}
template <typename T>
void visit(Snode<T>N)
{
visit(N.p);
}
template<typename Ty>
void Postorder2(Btree<Ty> T) {//后序非递归遍历
Snode<Ty>sn;//用于赋值
Snode<Ty> *st;//用于获取实时状态的指针
Btree<Ty> P = T;
Sqstack<int> S;
Initstack(S,10);
while (P) {
sn.p = P;
sn.rvisited = 0;
Push(S, sn);
P = P->l;
}
while (!stackempty(S)) {
//Gettop(S, sn);//该函数仅仅是赋值而已!!!!
st = &S.Elem[S.top];
if (st->p->r == NULL || st->rvisited) {
Pop(S, sn);
visit(sn);
}
else {
st->rvisited = 1;
P = st->p->r;
while (P) {
sn.p = P;
sn.rvisited = 0;
Push(S, sn);
P = P->l;
}
}
}
}
主文件
#include<iostream>
using namespace std;
#include"Sqstack.h"
int main()
{
Btnode<int> T;
Btree<int> P = &T;
Settreew(&T, 6, 1);
int Y = Btdepth(&T);
cout << "Depth=" << Y<<endl;
Postorder2(&T);
}