#include<iostream>
using namespace std;
#define BinTreeNode int
struct seqBinTree {
int MAXNUM;
int n;
char *nodes;
};
typedef struct seqBinTree *PSQBinTree;
PSQBinTree createEmptyBinTree(int num);
int constructBinTree(PSQBinTree t, char * elemList);
int isNULL(PSQBinTree t);
BinTreeNode root(PSQBinTree t, BinTreeNode i);
BinTreeNode parent(PSQBinTree t, BinTreeNode c);
BinTreeNode leftChild(PSQBinTree t, BinTreeNode p);
BinTreeNode rightChild(PSQBinTree t, BinTreeNode p);
int print(PSQBinTree t);
void preOrder(PSQBinTree t, int i); //前序
void inOrder(PSQBinTree t, int i); //中序
void postOrder(PSQBinTree t, int i); //后序
int visit(PSQBinTree t, BinTreeNode p);
int destroyBinTree(PSQBinTree t);
PSQBinTree createEmptyBinTree(int num) //创建空二叉树
{
PSQBinTree t = new seqBinTree;
if(t != NULL)
{
t->nodes = new char[num];
t->n = 0;
t->MAXNUM = num;
return t;
}
cout<<"Out of space"<<endl;
return NULL;
};
int constructBinTree(PSQBinTree t, char * elemList) //构造二叉树
{
if((strlen(elemList)) <= t->MAXNUM)
{
for(int i = 0; i < strlen(elemList); i++)
{
t->nodes[i] = elemList[i];
t->n++;
}
return 1;
}
cout<<"Out Space"<<endl;
return 0;
};
int isNULL(PSQBinTree t) //判断是否为空
{
if(t->n == 0)
return 1;
else
return 0;
};
BinTreeNode root(PSQBinTree t, BinTreeNode i)
{
return i;
};
BinTreeNode parent(PSQBinTree t, BinTreeNode c) //返回下标c结点的父结点的下标
{
if(c <= 0 || c >= t->n)
return -1;
return (c - 1) / 2;
};
BinTreeNode leftChild(PSQBinTree t, BinTreeNode p) //返回下标C的结点的左子结点的下标
{
if(p < 0 || p > t->n)
return -1;
return 2*p + 1;
};
BinTreeNode rightChild(PSQBinTree t, BinTreeNode p) //返回下标C的结点的右子结点的下标
{
if(p < 0 || p > t->n)
return-1;
return 2 * (p+1);
}
int print(PSQBinTree t) //输出二叉树所有元素以及关系
{
cout<<"二叉树所有元素:";
for(int i = 0; i < t->n; i++)
{
if(t->nodes[i] != '#')
cout<<t->nodes[i]<<" ";
}
cout<<endl;
for(int j = 0; j < t->n; j++)
{
if(t->nodes[j] != '#')
{
cout<<t->nodes[j]<<":";
if(parent(t, j) != -1)
{
cout<<"父结点:"<<t->nodes[parent(t, j)]<<" ";
}
if(leftChild(t, j) != -1 && t->nodes[leftChild(t, j)] != '#')
{
cout<<"左子结点:"<<t->nodes[leftChild(t, j)]<<" ";
}
if(rightChild(t, j) != -1 && t->nodes[rightChild(t, j)] != '#')
{
cout<<"右子结点:"<<t->nodes[rightChild(t, j)]<<" ";
}
cout<<endl;
}
}
return 1;
};
void inOrder(PSQBinTree t, int i) //中根遍历
{
if(t->nodes[i] == '#')
return ;
inOrder(t, leftChild(t, i));
visit(t, root(t, i));
inOrder(t, rightChild(t, i));
};
void postOrder(PSQBinTree t, int i) //后根遍历
{
if(t->nodes[i] == '#')
return ;
postOrder(t, leftChild(t, i));
postOrder(t, rightChild(t, i));
visit(t, root(t, i));
};
void preOrder(PSQBinTree t, int i) //先根遍历
{
if(t->nodes[i] == '#')
return ;
visit(t, root(t, i));
preOrder(t, leftChild(t, i));
preOrder(t, rightChild(t, i));
};
int visit(PSQBinTree t, BinTreeNode p)
{
cout<<t->nodes[p]<<" ";
return t->nodes[p];
};
int destroyBinTree(PSQBinTree t) //销毁二叉树
{
delete(t->nodes);
delete(t);
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
char ch[32] = "ABCD#EF#####GHI################"; //定义二叉树
PSQBinTree t = createEmptyBinTree(31);
constructBinTree(t, ch);
print(t);
cout<<"\n\n";
cout<<"中根遍历:"; //中根遍历
inOrder(t, 0);
cout<<endl;
cout<<"后根遍历:"; //后根遍历
postOrder(t, 0);
cout<<endl;
cout<<"先根遍历:"; //先根遍历
preOrder(t, 0);
cout<<endl;
destroyBinTree(t); //销毁二叉树
return 0;
};