#include<iostream>
#include<Windows.h>
using namespace std;
//创建二叉树结构体;
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;//左右孩子指针
}BiTNode, *BiTree;
//构建一个循环队列
typedef struct Qnode {
BiTNode *base;
int front;//头
int rear;//尾
}sqQueue;
class tree {
private:
BiTree root;
sqQueue q;
public:
tree() {
CreatBiTree(root);
}
BiTree get_root() {//得到root节点;
return root;
}
//创建一个循环队列
void InitQueue(sqQueue &q) {
q.base = new BiTNode[5];
q.front = q.rear = 0;
}
//创建二叉树
BiTree CreatBiTree(BiTree &t) {
int val;
cin >> val;
getchar();
if (val <= 0) t = NULL;
else {
t = new BiTNode;
t->data = val;
CreatBiTree(t->lchild);
CreatBiTree(t->rchild);
}
return t;
}
//先序遍历
void PreOrderTraverse(BiTree &t) {
if (!t) return;
else {
cout << t->data << " ";
PreOrderTraverse(t->lchild);
PreOrderTraverse(t->rchild);
}
}
//中序排序
void InOrderTraverse(BiTree &t) {
if (!t) return;
else {
InOrderTraverse(t->lchild);
cout << t->data << " ";
InOrderTraverse(t->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree &t) {
if (!t) return;
else {
PostOrderTraverse(t->lchild);
PostOrderTraverse(t->rchild);
cout << t->data << " ";
}
}
//层序遍历
void LevelOrderTraverse(BiTree &t) {
if (!t)return;
else {
InitQueue(q);
q.base[q.rear] = *t;
q.rear = (q.rear + 1) % 5;
}
while (q.front != q.rear) {
BiTNode temp = q.base[q.front];
cout << temp.data << " ";
if (temp.lchild) {
q.base[q.rear] = *temp.lchild;
q.rear = (q.rear + 1) % 5;
}
if (temp.rchild) {
q.base[q.rear] = *temp.rchild;
q.rear = (q.rear + 1) % 5;
}
q.front = (q.front + 1) % 5;
}
}
//统计节点的数目
void Count_TreeEnds(BiTree &t, int &n) {
if (t) {
if (!t->lchild && !t->rchild)
n++;
Count_TreeEnds(t->lchild, n);
Count_TreeEnds(t->rchild, n);
}
}
//交换左右子树
BiTree Exchange(BiTree &t) {
if (!t)return NULL;
BiTree lchild = Exchange(t->rchild);
BiTree rchild = Exchange(t->lchild);
t->lchild = lchild;
t->rchild = rchild;
return t;
}
//5. 计算并输出该二叉树的深度。
int Depth(BiTree &t) {
int l = 0, r = 0;
if (t == NULL) return 0;
l = Depth(t->lchild) + 1;
r = Depth(t->rchild) + 1;
return l > r ? l : r;
}
};
int main() {
tree T;
int n = 0;//叶子结点
int deep;//深度
BiTree PT = T.get_root();
cout << "先序遍历:";
T.PreOrderTraverse(PT); cout << endl;
cout << "中序遍历:";
T.InOrderTraverse(PT); cout << endl;
cout << "后序遍历:";
T.PostOrderTraverse(PT); cout << endl;
cout << "层序遍历:";
T.LevelOrderTraverse(PT); cout << endl;
cout << "叶子节点数:";
T.Count_TreeEnds(PT, n);
cout << n << endl;
BiTree exT;
exT = T.Exchange(PT);
cout << "交换后的先序遍历:";
T.PreOrderTraverse(exT); cout << endl;
cout << "该二叉树的深度:";
deep = T.Depth(exT); cout << deep << endl;
system("pause");
return 0;
}