本次实验的内容有:
1、前序遍历生成二叉树;
2、前序、中序、后序遍历上述生成的二叉树(使用递归);
3、使用非递归方式中序遍历二叉树;
4、输出二叉树的深度、节点个数。
本来写的是顺序栈,后来看栈中存的是指针,就改成链栈了。
另外在创建二叉树的时候,用#代表空位置。
接下里是运行图片:
代码
#include <bits/stdc++.h>
using namespace std;
typedef struct BiTnode{
char data;
struct BiTnode *lchild,*rchild;
}BiTnode,*BiTtree;
typedef struct Linknode{ //创建链栈
BiTnode *data;
struct Linknode *next;
}*Linkstack,Linknode;
void create(BiTtree &T)
{
char data;
cin >> data;
if(data == '#')
{
T = NULL;
}
else{
T = new BiTnode;
T -> data = data;
create(T -> lchild);
create(T -> rchild);
}
}
void createstack(Linkstack &S)
{
S = NULL;
}
int emptystack(Linkstack &S)
{
if(S == NULL)
return 1;
else
return 0;
}
int push(Linkstack &S,BiTtree p)
{
Linknode *q;
q = new Linknode;
q -> data = p;
q -> next = S;
S = q;
return 1;
}
BiTtree pop(Linkstack &S)
{
BiTnode *p;
p = S -> data;
S = S -> next;
return p;
}
void preorder(BiTtree T)
{
if(T)
{
cout << T -> data << ' ';
preorder(T -> lchild);
preorder(T -> rchild);
}
}
void inorder(BiTtree T)
{
if(T)
{
inorder(T -> lchild);
cout << T -> data << ' ';
inorder(T -> rchild);
}
}
void postorder(BiTtree T)
{
if(T)
{
postorder(T -> lchild);
postorder(T -> rchild);
cout << T -> data << ' ';
}
}
int stacksize(Linkstack &S)
{
int num = 0;
Linknode *p;
p = S;
while(p)
{
num++;
p = p -> next;
}
return num;
}
void stackinorder(BiTtree &T)
{
Linkstack S;
createstack(S);
BiTnode *p,*q;
p = T;
q = new BiTnode;
while(p || !emptystack(S))
{
if(p)
{
push(S,p);
p = p -> lchild;
}
else{
q = pop(S);
cout << q -> data << ' ';
p = q -> rchild;
}
}
}
int deepth(BiTtree &T)
{
if(T == NULL)
return 0;
int m = deepth(T -> lchild);
int n = deepth(T -> rchild);
if(m > n)
return m + 1;
else
return n + 1;
}
int nodenum(BiTtree &T)
{
if(T == NULL)
return 0;
else
return nodenum(T -> lchild) + nodenum(T -> rchild) + 1;
}
int main()
{
BiTtree T;
cout << "请输入前序的二叉树序列:(#代表空)" << endl;
create(T);
cout << "接下来是前序遍历二叉树:" << endl;
preorder(T);
cout << endl;
cout << "接下来是中序遍历二叉树:" << endl;
inorder(T);
cout << endl;
cout << "接下来是后序遍历二叉树:" << endl;
postorder(T);
cout << endl;
cout << "接下来是中序非递归遍历二叉树:" << endl;
stackinorder(T);
cout << endl;
cout << "接下来是二叉树的深度:" << endl;
cout << deepth(T) << endl;
cout << "接下来是二叉树的节点个数:" << endl;
cout << nodenum(T) << endl;
}