#include < iostream >
#define NUM 100
using namespace std;
// 定义二叉树结点
typedef struct TreeNode{
int data;
struct TreeNode *lchild,*rchild;
}TreeNode, *pTreeNode;
// 递归创建二叉树
pTreeNode createTree(int i, int n)
{
if(i<=n){
pTreeNode p = new TreeNode; // 创建头结点
p->data = i;
p->lchild = createTree(2*i,n);
p->rchild = createTree(2*i+1,n);
}
else return NULL;
}
// 定义队列(循环队列)
typedef struct{
pTreeNode elem[NUM];
int front,rear;
int queuesize; // 队列的容量(也可以省略)
}sqQueue;
// 创建队列
void initQueue(sqQueue &s)
{
s.front = s.rear = NUM;
s.queuesize = NUM;
}
// 队空
int emptyQueue(sqQueue s)
{
if(s.front == s.rear)
return 1;
else return 0;
}
// 入队
void enQueue(sqQueue &s, pTreeNode e)
{
if((s.rear+1)%NUM==s.front) // 队满,返回
return;
s.rear = (s.rear+1)%NUM;
s.elem[s.rear] = e;
}
// 出队
void deQueue(sqQueue &s, pTreeNode &e)
{
if(emptyQueue(s)) // 队空,返回
return;
s.front = (s.front+1)%NUM;
e = s.elem[s.front];
}
// 队列的方法创建二叉树
pTreeNode createTree2(int i, int n)
{
sqQueue s; // 创建队列
initQueue(s);
pTreeNode T = new TreeNode; // 创建根结点
T->data = i;
T->lchild = T->rchild = NULL;
enQueue(s,T); // p结点进栈
while(!emptyQueue(s)){ // 队列非空(队列为空时结束,表示没有需要连接的根结点)
pTreeNode p; // 不能少!! 否则返回的只有头结点! (这里的 p 和上面的 p 含义不同)
deQueue(s,p); // 把需要连接的根结点 pop 出来
int j = p->data;
if(2 * j<=n){ // 存在左节点
pTreeNode pl = new TreeNode; // 创建根结点(左节点)
pl->data = 2 * j;
pl->lchild = pl->rchild =NULL;
p->lchild = pl; // 左节点并入树
enQueue(s,pl);
}
if(2 * j+1<=n){
pTreeNode pr = new TreeNode; // 创建根结点(右结点)
pr->data = 2*j+1;
pr->lchild = pr->rchild =NULL;
p->rchild = pr;
enQueue(s,pr);
}
}
return T; // 返回的是整个数的 p
}
// 先序遍历
void preOrder(pTreeNode pt)
{
if(pt){
cout<<pt->data<<" ";
preOrder(pt->lchild);
preOrder(pt->rchild);
}
}
// 中序遍历
void inOrder(pTreeNode pt)
{
if(pt){
inOrder(pt->lchild);
cout<<pt->data<<" ";
inOrder(pt->rchild);
}
}
// 先序遍历
void postOrder(pTreeNode pt)
{
if(pt){
postOrder(pt->lchild);
postOrder(pt->rchild);
cout<<pt->data<<" ";
}
}
int main()
{
pTreeNode pt = createTree(1,6); // 递归方法创建树
cout<<"createBTree(1,6)"<<endl;
cout<<"preOrder: "; //先序遍历
preOrder(pt);
cout<<endl;
cout<<"inOrder: "; // 中序遍历
inOrder(pt);
cout<<endl;
cout<<"postOrder: ";
postOrder(pt); // 后序遍历
cout<<endl;
cout<<endl;
pt = createTree2(1,6); // 队列方法创建树
cout<<"createBTree2(1,6)"<<endl;
cout<<"preOrder: "; //先序遍历
preOrder(pt);
cout<<endl;
cout<<"inOrder: "; // 中序遍历
inOrder(pt);
cout<<endl;
cout<<"postOrder: ";
postOrder(pt);
cout<<endl;
return 0;
}